顺序队列c

所谓假溢出就是如果判满条件为front+1==rear,那么图四会被判为满队列,但是实际上只储存了一个元素
考虑使用循环结构,即rear到达队列顶,再次+1则会回到底部继续往上走,直到遇到front,这时任何情况都表示满,不在会出现假溢出
#include<stdlib.h>
#include<stdio.h>
#define MAXSIZE 1000
typedef int ElemType;
typedef struct{
ElemType *base;
int front;
int rear;
}SubQueue;
//队列设头尾指针,默认头指针指向第一个元素
//尾指针指向对位的下一个位置
//由于假溢出现象,我们把队列指针设置为循环模式,认为MAXSIZE-1个元素即为队满
//s->front=s->rear为空
//(s->rear+1)%MAXSIZE=s->front,说明rear跑到front屁股后面了,为满
//初始化:分配内存,设置头尾节点为零
int init(SubQueue *s);
//获取队列长度:由于尾节点可能循环到头节点下面了,所以加上MAXSIZE再模就好了( 尾节点-头节点+MAXSIZE)%MAXSIZE
int getlength(SubQueue s);
//判断是否满,插入队尾,尾指针+1
int enter(SubQueue *s,ElemType e);
int out(SubQueue *s,ElemType *e);
int gethead(SubQueue s);
int getall(SubQueue s);
int main(){
SubQueue s;
init(&s);
for(int i=1;i<100;i++){
enter(&s,i);
}
ElemType trash;
out(&s,&trash);
getall(s);
}
int init(SubQueue *s){
s->base=malloc(sizeof(ElemType)*MAXSIZE);
if(!s->base){
printf("分配失败");
return 0;
}
s->front=0;
s->rear=0;
return 1;
}
int getlength(SubQueue s){
return (s.rear+MAXSIZE-s.front)%MAXSIZE;
}
int enter(SubQueue *s,ElemType e){
if((s->rear+1)%MAXSIZE==s->front){
printf("队列已满");
return 0;
}
s->base[s->rear]=e;
s->rear++;
s->rear%=MAXSIZE;
return 1;
}
int out(SubQueue *s,ElemType *e){
if(s->rear==s->front){
printf("队列已空");
return 0;
}
*e=s->base[s->front];
s->front++;
s->front%=MAXSIZE;
return 1;
}
int gethead(SubQueue s){
if(s.rear!=s.front){
return s.base[s.front];
}
pritnf("队列为空");
}
int getall(SubQueue s){
if(s.rear==s.front){
printf("队列为空");
return 0;
}
if(s.rear>s.front){
for(int i=s.front;i<s.rear;i++){
printf("%d ",s.base[i]);
}
return 1;
}
else{
for(int i=s.front;i<(s.rear+MAXSIZE);i++)printf("%d ",s.base[i%MAXSIZE]);
return 1;
}
}

浙公网安备 33010602011771号