队列:
队列是特殊的线性表。
队列的抽象数据模型:
1)初始化操作,建立一个空队列Q;
2)若队列存在,则销毁它;
3)将队列清空;
4)若队列Q为空,返回true,否则返回false;
5)若队列Q存在且非空,用e返回队列Q的队头元素;
6)若队列Q存在,插入新元素e到队列Q中,并成功称为队尾元素;
7)删除队列Q中队头元素,并用e返回其值;
8)返回队列Q的元素个数;
循环队列:
队列顺序存储的不足:避免出现只有一个元素时,队头和队尾的重合处理麻烦,引入front指向队头元素,rear指向队尾元素的下一个位置; front=rear时,队列不是还剩一个元素,而是空队列。
循环队列定义:把头尾相接的顺序存储结构称为循环队列;
判断队列满的条件:(rear+1)%QueueSize==front;
通用的计算队列长度公式为: (rear-front+QueueSize)%QueueSize;
结构体定义如下: typedef struct { int data[MAXSIZE]; int front; int rear; }SqQueue;
初始化一个空队列Q: int InitQueue(SqQueue *Q) { Q->front = 0; Q->rear = 0; return OK; }
求队列长度: int QueueLength(SqQueue Q) { return (Q.rear -Q.front+MAXSIZE)%MAXSIZE; }
循环队列的入队列: int EnQueue(SqQueue *Q, int e) { if((Q->rear+1)%MAXSIZE ==Q->front) return ERROR; Q->data[Q->rear] = e; Q->rear=(Q->rear+1)%MAXSIZE; return OK; }
循环队列的出队列: int DeQueue(SqQueue *Q, int *e) { if(Q->rear==Q->front) return ERROR; *e=Q->data[Q->front]; Q->front=(Q->front+1)%MAXSIZE; return OK; }