循环队列的c语言顺序存储结构的实现
本文用c语言实现了循环队列的顺序存储结构,有几点需要注意:
- 本文实现的是顺序存储结构的循环链表,不是链式结构(敬请期待)
- 队尾指针指向下一个元素入队时的位置,不指向队尾元素
- 队头指针指向队头元素(也就是下一个出队的元素)
- 为了判别队空队满的不同,要留出一个格子不存放元素(还有其他方式,不浪费格子也可以区分空与满,敬请期待)
- 有问题请私信,能帮到您是我最大荣幸
- 本文代码参考了《王道考研数据结构》中的代码,是笔者备考考研过程中自己敲得代码,运行测试过,暂时没发现问题。
#include<stdio.h>
#include<stdbool.h>
#define MaxSize 10
/*
利用顺序存储实现的一个 循环链表
1.头指针front指向队头(出队的位置)的元素
2.尾指针rear指向队尾(入队位置)的下一个位置
3.这样的设计,导致我们需要留下预分配空间中的一位,以便于区分队空和队满
4.队空的条件为:rear==front;队满的条件为:(rear+1)%MaxSize==front
5.注意:头指针和尾指针都是int变量,直接存储数组中元素的序号
*/
typedef struct{
int data[MaxSize];
int front,rear;
}SqQueue;
//初始化队列,头指针和尾指针指向同一个位置(也就是队列判空的条件),0
void InitQueue(SqQueue *Q){
(*Q).rear=(*Q).front=0;
}
bool QueueEmpty(SqQueue Q){
if(Q.front==Q.rear){
printf("队列为空\n");
return true;
}
else{
printf("队列不空\n");
return false;
}
}
//入队操作,首先需要判断队列是否已满
bool EnQueue(SqQueue *Q, int x){
if((*Q).front == ( (*Q).rear+1 ) % MaxSize)
{
printf("Error:队列已满,新元素无法入队\n");
return false;
}
(*Q).data[ (*Q).rear ] = x;//把元素放到目前rear指针所指的位置
(*Q).rear = ( (*Q).rear+1 ) % MaxSize;//由于指针指向的是队尾的下一个元素,所以我们还要移动指针,为了解决循环队列“伪溢出”的问题我们引入模运算来构造循环队列
return true;
}
//出队操作,首先需要判断队列是否已空
bool Dequeue(SqQueue *Q, int *x){
if( (*Q).front==(*Q).rear )
{
printf("ERROR:队列已空,出队失败\n");
return false;
}
(*x)=(*Q).data[ (*Q).front ];//x变量用于返回被删除节点的元素值
(*Q).front=( (*Q).front+1 )%MaxSize;//移动队头指针
return true;
}
//获取队头元素的值,用x返回
bool GetHead(SqQueue Q, int *x){
if(Q.rear==Q.front)
{
printf("Error:队列中没有元素,队头元素不存在\n");
return false;
}
*x=Q.data[Q.front];
return true;
}
int main(){
/*自己要用的代码*/
return 0;
}