C语言实现队列
运行环境:Dev-C++ 5.11
编程语言:C
一、队列是什么?
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。【1】:摘自百度
二、有关数据及操作:数据类型,初始化,队列长度,入队、出队
在此说明关于本程序的一些注意事项:
- 本程序使用数组存储数据,默认存储数据个数为100,实际只能存储99(具体看第6点和程序代码),可以手动调,在自定义宏里
- 本程序将队列实现为循环队列,即不用考虑队列经一系列操作后可用空间变小的问题。
- 在调用函数时,用到的都是指针,记得在主程序调用函数加&;
- 队列中数据类型可以根据所需的类型变化,但在本程序中一个程序中只能定义一种类型队列,如过需要多类型队列,建议使用其他语言。在本程序中只需修改自定义宏var所代表的类型。
- 创建队列后必须进行初始化,可以自行改进,这里仅作为示范。
- rear指向队尾:指向队列尾后一个空位置。可以修改,让数组全部存储数据,自行思考
队列初始化,front即空队列:
满队列:(这里可以看一下队列判满操作)rear指向队尾空位置,front指向队首元素。下图:表示队列以及循环排列。
三、代码
代码如下(示例):
#include <stdio.h>
#include <stdlib.h>
#define MaxQueue 100
#define var int
//typedef int var; 与宏作用一致
typedef struct node //自定义队列
{
var entry[MaxQueue];
int front;
int rear;
}Queue;
void InitQueue(Queue *Q) //初始化数组队列
{
Q->front=0;
Q->rear=0;
}
int QueueLength(Queue *Q) //求队列的长度
{
return (Q->rear - Q->front + MaxQueue)%MaxQueue;
}
int QueueEmpty(Queue *Q) //判队是否空
{
if(Q->front==Q->rear)
return 0;
else
return 0;
}
int QueueFull(Queue *Q) //判队是否为满
{
if((Q->rear + 1)%MaxQueue==Q->front)
return 1;
else
return 0;
}
//入队
void EnQueue(Queue *Q,var e) //插队或排队(在队尾)
{
if(QueueFull(Q))
{
printf("Queue is Full !!!");
exit(0);
}
else
{
Q->entry[Q->rear]=e;
Q->rear=(Q->rear+1)%MaxQueue;
}
}
// 出队
void DeQueue(Queue *Q,var *e)
{
if(QueueEmpty(Q))
{
printf("Queue is Empty !!!");
exit(0);
}
else
{
*e=Q->entry[Q->front];
Q->front=(Q->front+1)%MaxQueue;
}
}
//打印队列的信息
void PrintQueue(Queue *Q)
{
int i=Q->front;
while(i!=Q->rear)
{
printf("%d\n",Q->entry[i]);
i=(i+1)%MaxQueue;
}
}
int main()
{
//示例
Queue q;
InitQueue(&q);
var v=6;
EnQueue(&q,v);
PrintQueue(&q);
system("pause");
return 0;
}
总结
队列作为基本的数据结构,是我们学习数据结构的前奏。在以后的数据结构学习当中,它可以和栈一起组合,实现复杂问题的求解。