// 队列的顺序存储
// 队空:front=rear=0
// 入队:rear+1
// 出队:front+1
// 该数组无头元素,出队入队都向上。
// 会产生假溢出,即rear=MAXSIZE且元素未填满队列时。
// 如何判断真正的上溢出?rear=MAXSIZE & rear!=0
// 扩展:区分真假溢出,如果是假溢出,可以reset一下。
// 但是如果数据量大,reset或不能达到很好的性能
/* 左front 右rear */
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 50
#define NONE 1e8 //一个元素也没有的时候,front和rear置为None
typedef struct queue{
int data[MAXSIZE];
int front,rear;
}Queue;
void initQueue(Queue *Q){
Q->front=Q->rear=NONE;
}
int isFull(Queue *Q){
if(Q->rear < MAXSIZE | Q->rear==NONE)
return 0; // 未溢出
return Q->front == 0 ? 1:-1; // 真溢出、假上溢
}
// 同样,front==rear时可能为空也可能不为空,空的时候设置front=rear=1e9
int isEmpty(Queue *Q){
return Q->rear==NONE ? 1:0; // 1 未空、剩一个都可出队
}
int enQueue(Queue *Q,int e){
if(isFull(Q)) return 0;
if(isEmpty(Q)){ // 空队的时候特殊处理
Q->front=Q->rear=0;
Q->data[0]=e;
}
else {
Q->rear++;
Q->data[Q->rear]=e; // 先+1后入队
}
return 1;
}
int deQueue(Queue *Q,int *e){
if(isEmpty(Q)){
puts("Empty!");
return 0; // 先排除是空队的情况
}
if(Q->front==Q->rear){ // 如果出队的是最后一个元素,则front不用+1,此时front、rear归零
*e=Q->data[Q->front];
Q->front=Q->rear=NONE;
}
else
*e=Q->data[Q->front++];
return 1;
}
void disp(Queue Q){
int idx=Q.front;
if(idx==NONE) {
puts("none can be display!");
return;
}
while(idx<=Q.rear){
printf("%d ",Q.data[idx++]);
}
printf("\n");
}
int main(){
Queue Q;
initQueue(&Q);
for(int i = 0; i<3 ; i++){
enQueue(&Q,i);
}
disp(Q);
int e;
deQueue(&Q,&e);
printf("%d ",e);
deQueue(&Q,&e);
deQueue(&Q,&e);
printf("%d \n",e);
disp(Q);
return 0;
}
3.1 队列-顺序存储
最新推荐文章于 2024-07-25 17:00:18 发布