1、1可扩充循环队列头文件与主程序/可扩充循环队列头文件.h#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define NULL 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;/可扩充循环队列- 队列的顺序存储结构#define MAXSIZE 5 /队列初始分配元素#define QUEUEINCREMENT 2 /存储增typedef structQElemType *base; /初始化的动态分配存储空间int front; /头指针,若队列不空,指向
2、队队头元素int rear; /尾指针,若队列不空,指向队队尾元素的下一个位置int queuesize; /当前已分配的空间SqQueue;/*约定:1.队列尾指针为实际末尾无素的下一位置. 2.浪费一个元素空间 ,以“ 队列头指针在队列尾指针的下一位置(指环状的下一位置) 上作为队列呈“满“状态的标志.Q 为空循环队列的判定条件为 :头尾重合 Q.front=Q.rearQ 为满循环队列的判定条件为 :队尾赶上队头 (Q.rear+1)%MAXSIZE=Q.front */Status InitQueue(SqQueue if (!Q.base) exit(OVERFLOW); /存储分配
3、失败Q.front=Q.rear=NULL;Q.queuesize=MAXSIZE;return OK;Status DestroyQueue(SqQueue Q.base=NULL;Q.front=Q.rear=NULL;Q.queuesize=0;return OK;Status ClearQueue(SqQueue return OK;2int QueueLength(SqQueue Q)/4.返回 Q 的元素个数,即队列的长度return (Q.rear-Q.front+Q.queuesize)%Q.queuesize;Status QueueEmpty(SqQueue Q)/5.判循
4、环队列空if (Q.front=Q.rear) return TRUE; /队列空else return ERROR;Status GetHead(SqQueue Q,QElemType /队列空e=Q.baseQ.front; return OK;Status EnQueue(SqQueue if (!Q.base) exit(OVERFLOW); /存储分配失败if (Q.frontQ.rear) /队头指针在队尾指针之前增加空间破坏了原来的循环关系for (int i=Q.queuesize-1; i=Q.front; i-) Q.basei+QUEUEINCREMENT=Q.basei
5、; /将原队列最末存储单元至队头元素依次后移使其重新保持循环关系Q.front+=QUEUEINCREMENT; /队头指针后移Q.queuesize+=QUEUEINCREMENT; /队空间大小增加Q.baseQ.rear=e; /元素插入新的队尾Q.rear =(Q.rear+1)%Q.queuesize; /循环队列队尾指针后移一个位置return OK;Status DeQueue(SqQueue /队列空e=Q.baseQ.front; /队头元素赋给 eQ.front=(Q.front+1)%Q.queuesize; /循环队列队头指针后移一个位置return OK;Status
6、 QueueTraverse(SqQueue if (Q.front=Q.rear) return ERROR;while (i!=Q.rear) visit(Q.basei); i=(i+1)%Q.queuesize; return OK;3/可扩充循环队列主程序.cpp#include #include typedef int QElemType; /循环队列元素类型#include “可扩充循环队列头文件 .h“void print(QElemType e)/显示数据元素coute;void main()SqQueue Q; QElemType e; char c;while (1)co
7、utc;switch(c)case 0: return ;case 1: if (InitQueue(Q) cout“创建空队列成功!“;else cout“创建空队列失败!“endl; break;case 2: if (DestroyQueue(Q) cout“成功销毁队列!“;else cout“销毁队列失败!“; break;case 3: ClearQueue(Q);if (QueueEmpty(Q) cout“队列已清空!“;else cout“队列未被清空!“endl; break;case 4: if (QueueEmpty(Q) cout“队列为空!“;else cout“队
8、列非空!“; break;case 5: cout“队列长为:“QueueLength(Q); break;case 6: if (GetHead(Q,e) cout“队列头元素为:“e; break;case 7: cout“请输入要入队的元素:“; Input(e);if (EnQueue(Q,e) cout“元素成功入队!“;else cout“元素入队失败!“endl; break;case 8: if (DeQueue(Q,e) cout“元素出队成功!“;cout“出队元素为“e; break;case 9: QueueTraverse(Q,print); break;defaul
9、t : break;coutendl;41 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择 0-9:1创建空队列成功!1 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择 0-9:7请输入要入队的元素:1元素成功入队!1 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择 0-9:7请输入要入队的元素:2元素成功入队!1 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请
10、选择 0-9:7请输入要入队的元素:3元素成功入队!1 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择 0-9:7请输入要入队的元素:4元素成功入队!1 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择 0-9:91 2 3 41 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择 0-9:8元素出队成功!出队元素为 11 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出
11、请选择 0-9:8元素出队成功!出队元素为 21 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择 0-9:93 41 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择 0-9:7请输入要入队的元素:5元素成功入队!1 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择 0-9:7请输入要入队的元素:6元素成功入队!1 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择
12、 0-9:93 4 5 61 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择 0-9:75请输入要入队的元素:7元素成功入队!1 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择 0-9:93 4 5 6 71 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择 0-9:5队列长为:51 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择 0-9:6队列头元素为:31 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择 0-9:3队列已清空!1 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择 0-9:2成功销毁队列!1 建空队 2 销毁 3 清空 4 判空 5 求长 6 取队头 7 入队 8 出队 9 遍历 0 退出 请选择 0-9:0