前言:最开始的顺序队列中的顺序存储结构设计比较单一,导致出现队列中出现假溢出这样的情况,判断条件为:当front与rear相等时,
- 创建结构体
struct SqQueue{
int data[MaxSize];
int fornt,rear;
};
-初始化队列算法:
//初始化
void initQueue(SqQueue *&s){
s = (SqQueue *)malloc(sizeof(SqQueue));
s->fornt=s->rear=-1;
}
- 创建队列算法:
//创建队列
void createQueue(SqQueue *&s){
int num = 5;
while(num >= 0){
s->rear = s->rear + 1;
s->data[s->rear] = num--;
}
}
- 出队算法:
//出队
void outOfQueue(SqQueue *s){
while(s->fornt != s->rear){
s->fornt = s->fornt + 1;
printf("%3d",s->data[s->fornt]);
}
}
- 销毁队列算法:
//销毁队列
void destoryQueue(SqQueue *&s){
free(s);
printf("\n释放完毕");
}
- 运行结果如下:
(二)环形队列
根据最初的队列来看,发现之前的队列的定义方式出现了假溢出的问题,那我们可以使用环形队列来解决这个问题。
- 创建和定义结构体
#define MaxSize 6
struct SqQueue{
int data[MaxSize];
int front , rear;
};
- 创建环形队列算法:
//创建环形队列
void createQueue(SqQueue *&s){
if(((s->rear + 1) % MaxSize) == (s->front % MaxSize)){
printf("队列已满");
exit(1);
}
while(((s->rear + 1) % MaxSize) != (s->front % MaxSize))
{
s->rear = s->rear + 1;
s->data[s->rear] = s->rear;
}
}
补充:这里主要改进的地方是,牺牲一个元素空间用来判断队满队空的标志,也是在环形队列中最为常用的方法,所以这里环形队列中的元素是从下标位1开始到n-1个元素
如图所示,rear指针和front指针初始化是指向0位置的,入队的时候是从下一个位置开始入队,出队也是一样
- 出队算法:
//环形队列出队
void outOfQueue(SqQueue *s){
if((s->rear) % MaxSize == s->front % MaxSize){
printf("队列为空");
exit(1);
}
while((s->front) % MaxSize != (s->rear % MaxSize)){
s->front = s->front + 1;
printf("%3d",s->data[s->front]);
}
printf("\n出队完毕!\n");
}
- 最终结果展示: