数据结构之普通队列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)
{
if (head->curSize == 0)
{
head->left = -1;
head->right = -1;
return 1;
}
return 0;
}
这里之前有个BUG,重新去实现C++STL中的queue才发现的。现在已经改过来了。
之前empty的代码我写成的是下面的样子:
int empty(pQueue head)
{
return head->curSize==0;
}
之所以说它有BUG是因为在后面的pop函数实现的时候,pop函数里面要判断curSize成员是否为0,为0就将left和right赋值为-1(就是回到最初的状态)。但是到了测试下面的方式打印的时候,会有问题。
while(!empty(head))
{
printf("%d "