顺序队列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;
	}
}
posted @ 2025-05-25 19:10  hardestnut  阅读(14)  评论(0)    收藏  举报