数据结构笔记:队列
队列的抽象数据类型
c1
2
3
4
5
6
7
8
9
10
11
12ADT 队列(queue)
Data
Operation
InitQueue(*Q): 初始化操作,建立一个空队列Q
DestroyQueue(*Q): 若队列Q存在,则销毁它
ClearQueue(*Q): 将队列Q清空
QueueEmpty(Q): 若队列Q为空,返回true,否则返回false
GetHead(Q, *e): 若队列Q存在且非空,用e返回队列Q的队头元素
EnQueue(*Q, e): 若队列Q存在,插入新元素e到队列Q中并成为队尾元素
DeQueue(*Q, *e): 删除队列Q中队头元素,并用e返回其值
QueueLength(Q): 返回队列Q的元素个数
endADT循环队列
循环队列的结构
c1
2
3
4
5
61 typedef int QElemType; // QElemType类型根据实际情况而定,这里假设为int
2 typedef struct {
3 QElemType data[MAXSIZE];
4 int front; // 头指针
5 int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置
6 } SqQueue;循环队列的初始化
c1
2
3
4
5
61 // 初始化一个空队列Q
2 Status InitQueue(SqQueue *Q) {
3 Q->front = 0;
4 Q->rear = 0;
5 return OK;
6 }求循环队列的长度
c1
2
3
41 // 返回Q的元素个数,也就是队列的当前长度
2 int QueueLength(SqQueue Q) {
3 return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
4 }循环队列的入队列操作
c1
2
3
4
5
6
7
81 // 若队列未满,则插入元素e为Q新的队尾元素
2 Status enQueue(SqQueue *Q, QElemType e) {
3 if ((Q->rear+1)%MAXSIZE == Q->front) // 队列满的判断
4 return ERROR;
5 Q->data[Q->rear] = e; // 将元素e赋值给队尾
6 Q->rear = (Q->rear+1)%MAXSIZE; // rear指针向后移一位置,若到最后则转到数组头部
7 return OK;
8 }
队列的链式存储结构(链队列)
链队列的结构
c1
2
3
4
5
6
7
8
91 typedef int QElemType; // QElemType类型根据实际情况,这里假设为int
2 typedef struct QNode { // 结点结构
3 QElemType data;
4 struct QNode *next;
5 } QNode, *QueuePtr;
6
7 typedef struct { // 队列的链表结构
8 QueuePtr front, rear; // 队头、队尾指针
9 } LinkQueue;链队列的入队操作
c1
2
3
4
5
6
7
8
9
10
111 // 插入元素e为Q的新的队尾元素
2 Status EnQueue(LinkQueue *Q, QElemType e) {
3 QueuePtr s = (QueuePtr)malloc(sizeof(QNode));
4 if (!s) // 存储分配失败
5 exit(OVERFLOW);
6 s->data = e;
7 s->next = NULL;
8 Q->rear->next = s; // 把拥有元素e新结点s赋值给原队尾结点的后继
9 Q->rear = s; // 把当前的s设置为队尾结点,rear指向s
10 return OK;
11 }链队列的出队操作
c1
2
3
4
5
6
7
8
9
10
11
12
131 // 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR
2 Status DeQueue(LinkQueue *Q, QElemType *e) {
3 QueuePtr p;
4 if (Q->front == Q->rear)
5 return ERROR;
6 p = Q->front->next; // 将欲删除的队头结点暂存给p
7 *e = p->data; // 将欲删除的队头结点的值赋值给e
8 Q->front->next = p->next; // 将原队头结点后继p->next赋值给头结点
9 if (Q->rear == p) // 若队头是队尾,则删除后将rear指向头结点
10 Q->rear = Q->front;
11 free(p);
12 return OK;
13 }
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 怀民亦未寝。!