C语言-顺序队列的基本操作
一、我们先明确一下什么是队列?
队列(Queue):只允许在表的一端进行插入,另外一端进行删除
入队/进队:插入元素
出队/离队:删除元素
队头:允许删除的一端
队尾:允许插入的一端
二、顺序队列的存储结构是怎样的呢?
队列的顺序存储结构如下:
我们开辟了12个连续的int型存储空间,10个存储数据,1个存储队头指针,1个存储队尾指针。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10
typedef struct{
int data[MaxSize];
int front,rear; //定义队头,队尾指针,其值代表数组下标
}SqQueue;
三、顺序队列的基本操作:
1、初始化,让队头,队尾指针数值都为0,即默认都指向data[0]。
//初始化队列
void InitQueue(SqQueue *Q){
Q->front = Q->rear = 0; //队头,队尾初始化时都指向data[0]
}
2、判断队列是否为空,头尾指针若一样,则为空。
//判断队列是否为空
int QueueEmpty(SqQueue Q){
if(Q.front == Q.rear)
return 1;
else
return 0;
}
3、入队,队不满时,先赋值到队尾元素,再把队尾指针加1
//入队
int EnQueue(SqQueue *Q,int n){
if(Q->rear==MaxSize) //队满
{
printf("队列已满,插入元素失败");
return 0;
}
Q->data[Q->rear] = n; //把元素插入队尾
Q->rear += 1; //队尾指针加1取模
return 1;
}
4、出队,队不空时,先取队头元素,再把队头指针加1
//出队
int Dequeue(SqQueue *Q){
int top_number;
if(Q->rear == Q->front){
printf("队列为空,出队失败");
return 0;
}
top_number = Q->data[Q->front];
Q->front += 1;
return top_number;
}
5、获取队头元素,但是指针不动
//获取队头元素
int GetHead(SqQueue Q){
if(Q.rear == Q.front){
printf("队列为空");
return 0;
}
return Q.data[Q.front];
}
6、获取队列元素个数
//获取队列元素个数
int GetSum(SqQueue Q){
return Q.rear-Q.front;
}
7、销毁队列
void DestroyQueue(SqQueue *Q){
free(Q);
}
8、测试代码
void main(){
SqQueue Q;
InitQueue(&Q);
EnQueue(&Q,5);
EnQueue(&Q,6);
EnQueue(&Q,7);
printf("队列里元素个数为%d\n", GetSum(Q));
printf("队头元素为%d\n",GetHead(Q));
printf("出队:%d\n",Dequeue(&Q));
DestroyQueue(&Q);
}