1.队列的概念:只能选择一个端点进行插入操作(队尾),在另一端删除的线性表 (队头)
2.队列可实现的操作:
①置空队列
②判断队列是否为空
③入队
④取队头元素
⑤出队
3.存储结构:循环顺序队列
具体代码如下:
#include<stdio.h>
#include<stdlib.h>
#define Max 3
typedef int eletype;
typedef struct Node{
eletype data[Max];
int front,rear ;//front为队头元素前面位置的下标,rear为队尾元素的实际下标
} seQueue;
//队空的条件:rear==front
首先定义一个结构体变量seQueue,值得注意的是front为队头元素前面位置的下标,rear为队尾元素的实际下标
①置空队列
seQueue *setNull() {
seQueue *s=(seQueue *)malloc(sizeof(seQueue ));
s->rear=s->front=Max-1;
return s;
}
这里因为是循环队列,所以判断队空的条件可以是s->rear=s->front=Max-1也可以是s->rear=s->front=0
但是这两种条件均导致,队列中能容纳的元素为Max-1(只是在本代码中是这样的)
②判断队列是否为空
int Empty(seQueue *s){
return(s->rear==s->front?1:0);
}
若为空返回1,否则返回0
③入队
int enQueue(seQueue *s,eletype x){
if((s->rear+1)%Max==s->front){
printf("队满\n");
return 0;
}
else
s->rear=(s->rear+1)%Max;
s->data[s->rear]=x;
return 1;
}
循环队列中,入队时,会出现假满(上溢)的情况 ,
入队时,将rear在循环意义下加1,如果rear追上了front,则队满,从而当rear==front时,
无法区分是队空还是队满 。为了保证rear==front是队空的唯一条件,则入队时,不允许rear==front,
即rear即将追上front,认为队满。
这里我们用if((rear+1)%Max==front) 表示队满
用if(rear==front) 表示队空
④取队头元素
int getQueue(seQueue*s,eletype*x) {
if(s->rear==s->front) {
printf("队空\n") ;
return 0;
}
else
*x=s->data[(s->front+1)%Max] ;
return 1;
}
取队列s的队头元素值
如果取不成功,则返回为0
如果成功,则将队头元素赋值给形参变量x的指向,并返回1
⑤出队
int deQueue(seQueue*s,eletype*x) {
if(s->rear==s->front ){
printf("队空\n") ;
return 0;
}
else
s->front=(s->front+1)%Max;
*x=s->data[s->front];
return 1;
}
如果出队不成功,返回值为0
如果队空,则输出“队空”,并且返回0
将front在循环意义下加1,将原来的队头元素值赋值给指针变量x的指向 ,并返回1
主函数调用
int main(){
int y;
seQueue *s=setNull();
printf("%d\n",Empty(s));//1
printf("%d\n",getQueue(s,&y));//队空,0
printf("%d\n",deQueue(s,&y));//队空,0
printf("%d\n",enQueue(s,100));// 1
printf("%d\n",enQueue(s,200));// 1
printf("%d\n",enQueue(s,300));// 队满,下一行0
printf("%d\n",getQueue(s,&y));//取值成功,1
printf("y=%d\n",y);//y=100
printf("%d\n",deQueue(s,&y));//1
printf("y=%d\n",y);//y=100
printf("%d\n",deQueue(s,&y));//1,此时队空
printf("y=%d\n",y);//y=200
printf("%d\n",Empty(s));//1
printf("%d\n",getQueue(s,&y));//队空;
return 0;
}
运行结果: