前面的顺序队存在一些小问题,当队满也就是rear==MaxSize-1时,表示队满,实则是上溢出,队列中可能还存在空位置,这个情况也就是假溢出。可以使用环形队列解决这个问题:
队头指针:front循环增1 front = (front+1)%MaxSize
队尾指针:rear循环增1 front = (rear+1)%MaxSize
此时队头队尾指针都初始化为0.
为了区分队空队满,我们将 队尾指针增1等于队头指针 作为队满条件,如此我们将少用一个元素空间。队空条件 队尾队头指针相等。
函数列表
void DestroyStack(SqQueue * s);//销毁队列
bool EmptyStack(SqQueue * s);//判空
bool enQueue(SqQueue *s,ElemType e);//入队操作
bool dlQueue(SqQueue *s,ElemType e);//出队操作
int Count(SqQueue *s);
1.头文件
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MaxSize 50
typedef char ElemType;
2.初始化队列
typedef struct {
ElemType data[MaxSize];
int front,rear;
}SqQueue;
SqQueue *q;
q = (SqQueue * ) malloc(sizeof(SqQueue));
q -> front = q -> rear = 0;
3.销毁队列
void DestroyQueue(SqQueue * s) {
free(s);
printf("销毁成功\n");
}
4.判空
bool EmptyQueue(SqQueue * s){
if(s -> front == s -> rear){
printf("队列为空\n");
return false;
} else{
printf("队列不为空\n");
return true;
}
}
5.进队
bool enQueue(SqQueue *s,ElemType e){
if((s -> rear + 1) % MaxSize == s -> front){
printf("队列上溢出\n");
return false;
}
s -> rear = (s -> rear + 1) % MaxSize;
s -> data[s -> rear] = e;
printf("入队成功\n");
return true;
}
6.出队
bool dlQueue(SqQueue *s,ElemType e){
if(s -> front == s -> rear){
printf("队列空下溢出\n");
return false;
}
s -> front = (s -> front + 1) % MaxSize;
e = s -> data[s -> front];
printf("%c出队成功\n",e);
return true;
}
7.统计队列元素
int Count(SqQueue *s){
int x = (s -> rear - s -> front + MaxSize) % MaxSize;
printf("队列中有%d个元素\n");
return x;
}