2.3.1 队列的顺序结构存储实现
什么是队列
定义: 具有一定操作约束的线性表。只能在一端插入,在另一端删除。
插入数据: 入队列
删除数据: 出队列
特点: 先进先出(FIFO)
队列的顺序结构存储实现
队列的顺序存储结构通常由一个一位数组和一个记录队列头元素位置的变量front和一个记录队列尾元素位置的变量rear组成。
非顺环队列
插入元素,rear+1;删除元素,front+1
判断队列空:rear== front== 0
判断队列满:rear==MaxSize
顺环队列
插入元素,rear+1;删除元素,front+1
判断队列空:rear== front== 0
判断队列满:(rear+1)% MaxSize==front
队头和队尾间隔一个元素距离,为了方便判断队满。
代码实现:
#include "stdio.h"
#include "stdlib.h"
#define ERROR -2
#define MAXSIZE 10
typedef int Position;
struct QNode{
int *Data;
Position front,rear;
int MaxSize;
};
typedef struct QNode *Queue;
//顺环队列
Queue CreatQueue(int MaxSize){
Queue Q;
Q=(Queue)malloc(sizeof(struct QNode));
Q->Data=(int *)malloc(MaxSize * sizeof(int));
Q->front=Q->rear=0;
Q->MaxSize= MaxSize;
return Q;
}
bool IsEmpty(Queue Q){
return (Q->front==Q->rear);
}
bool IsFull(Queue Q){
return ((Q->rear+1)%Q->MaxSize==Q->front);
}
bool AddQ(Queue Q,int X){
if(IsFull(Q)){
printf("堆栈满!\n");
return false;
}else{
Q->rear=(Q->rear+1)%Q->MaxSize;
Q->Data[Q->rear]=X;
return true;
}
}
int DeleteQ(Queue Q){
if(IsEmpty(Q)){
printf("堆栈空!\n");
return ERROR;
}else{
Q->front=(Q->front+1)%Q->MaxSize;
return Q->Data[Q->front];
}
}
int main(){
Queue Q;
Q= CreatQueue(MAXSIZE);
printf("%d\n\n",DeleteQ(Q));
printf("%d\n",AddQ(Q,1));
printf("%d\n\n",AddQ(Q,2));
printf("%d\n",DeleteQ(Q));
printf("%d\n",DeleteQ(Q));
printf("%d\n",DeleteQ(Q));
return 0;
}
运行结果: