IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构之普通队列C语言版(简单易懂) -> 正文阅读

[数据结构与算法]数据结构之普通队列C语言版(简单易懂)

数据结构之普通队列C语言版

什么是普通队列

队列是一种数据结构,是用来存储数据的,普通队列是队列里最简单的,也比较好理解。操作和栈是差不多的。队列和栈的区别就是,栈是先进后出,队列是先进先出。然后就没有多大的区别了。

简单使用C语言实现普通队列

队列的基本概念就这么多,想深入了解概念的请看课本去。这里是使用编程语言来实现队列的。

前期准备

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define MAXSIZE 10

主要是包含是头文件,然后是预定义一个最大容量。

结构体封装

要实现一个数据结构首先是知道数据结构的样子是什么,然后画出来,然后对应的内容就使用对应的数据类型封装,在C语言中,就使用结构体来封装队列的各个组件。

队列的基本样子:
在这里插入图片描述

从图中可以看到的是队列有队头和队尾,所以使用两个标记去表示,left靠队头这边,right靠队尾这边。那就开始封装吧。

typedef struct Queue
{
	int elem[MAXSIZE];
	int left;
	int right;
	int curSize;
}Queue,*pQueue;

typedef是取别名:

typedef struct Queue Queue		//Queue是struct Queue的别名
typedef struct Queue* pQueue	//pQueue是struct Queue*的别名

初始化队列

pQueue creatQueue()
{
	pQueue head = (pQueue)malloc(sizeof(Queue));
	assert(head);
	head->left = -1;
	head->right = -1;
	head->curSize = 0;
	return head;
}

left和right一开始都初始化为-1方便等下操控elem数组。这里的初始化很随意,不过就是等下实现源代码的时候会做一些改变。问题不是很大。在堆区申请的内存,在函数结束后不会释放。

判断队列是否为空

int empty(pQueue head)
{
	return head->curSize == 0;
}

这就是万金油参数curSize的好处,封装好了之后就直接使用,如果不封装curSize成员的话也可以采用right-left表示。一样的意思。但我不想折磨自己,怎么简单怎么来。

判断队列是否满队

int full(pQueue head)
{
	return head->curSize >= MAXSIZE;	//MAXSIZE是已经预定义的量,10
}

获取队列当前元素个数

int size(pQueue head)
{
	return head->curSize;
}

直接返回curSize成员,没什么好说的。

获取队头

int front(pQueue head)
{
	return head->elem[head->left];
}

因为队列的特点是先进先出。所以封装一个获取头部元素的函数来调用队列中的数组的第一个元素(根据实际情况而言,因为等下出队的时候left会往右移动,所以就是返回elem数组中left表示下标下的元素)。函数的结构也很多简单。

出队函数

void pop(pQueue head)
{
	if (head->curSize == 0)
	{
		head->left = -1;
		head->right = -1;
		return;
	}
	head->left++;
	head->curSize--;
}

根据curSize的值判断当前队列是否为空的队列,如果为空队列就直接结束掉函数,在结束之前记得把left和right复位,回到最初的状态,因为已经出队了left和right没有必要继续待在elem的中间位置或者是最后位置了,而应该是回到elem数组第一个元素的前一个元素,也就是-1的位置。

测试函数

void test1()
{
	pQueue que = creatQueue();
	for (int i = 0; i < 3; i++)
	{
		push(que, i);
	}
	printf("%d\t%d\n", empty(que), size(que));
	while (!empty(que))
	{
		printf("%d ", front(que));
		pop(que);
	}
	printf("\n%d\t%d\n", empty(que), size(que));
	for (int i = 5; i < 9; i++)
	{
		push(que, i);
	}
	printf("%d\t%d\n", empty(que), size(que));
	while (!empty(que))
	{
		printf("%d ", front(que));
		pop(que);
	}
	printf("\n%d\t%d\n", empty(que), size(que));
	for (int i = 0; i < 6; i++)
	{
		push(que, i);
	}
	printf("%d\t%d\n", empty(que), size(que));
	for (int i = 6; i < 11; i++)
	{
		push(que, i);
	}
	printf("%d\t%d\n", empty(que), size(que));
	while (!empty(que))
	{
		printf("%d ", front(que));
		pop(que);
	}
	printf("\n%d\t%d\n", empty(que), size(que));
	for (int i = 10; i < 21; i++)
	{
		push(que, i);
	}
	printf("%d\t%d\n", empty(que), size(que));
	while (!empty(que))
	{
		printf("%d ", front(que));
		pop(que);
	}
	printf("\n%d\t%d\n", empty(que), size(que));
}

在主函数中调用这个函数,然后就会得到下面的结果:

0       3
0 1 2
1       0
0       4
5 6 7 8
1       0
0       6
队列已满
0       10
1 2 3 4 5 6 7 8 9 10
1       0
队列已满
队列已满
队列已满
队列已满
队列已满
队列已满
队列已满
队列已满
队列已满
队列已满
0       11
11 -33686019 -1937940619 -1937940619 -2079107460 799472782 789760239 803142870 803142870 -211528068 1694151040
1       0

队列就这样了,反复练就容易了。

把数据结构简单化-----------Cukor丘克

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-09 19:49:07  更:2021-11-09 19:52:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:18:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码