实验任务
实验4:队列的链式表示和实现<br /> 要求:某小超市有两个排队机,构建2个用带头结点的单链表队列QA和QB, 实现下列操作<br /> 1、初始化队列(清空);<br /> 2、入队;<br /> 3、出队;<br /> 4、求队列长度;<br /> 5、判断队列是否为空;<br /> 6、判断队列是否为满;<br /> 7、对于队列QA和QB,如果其中一个队列的售货员下班,则自动甩到另一个队列后面。<br />截止日期:4月22日
实验讨论
:::info 觉得问题里面有bug :::
对问题判满的疑惑与解决,第六个问题对链对判满是否有意义,如果是链式存储,数据结构本身判断满没有意义,但是考虑到是小型超市,超市空间不大,所以对其进行一开始的用户自己输入两个队列的最大长度。
但是这样又有一个问题,在问题7中,如果一个队列的售货员下班了,这个队列的所有人排到另一个队列中,那如果新队列的长度超出用户输入的队列最大长度呢?考虑到实际问题,这个问题不打算解决了,让他们挤挤……
代码代码
#include<bits/stdc++.h>using namespace std;typedef int Status;typedef int QElemType;#define OVERFLOW -1#define ERROR 0#define OK 1/**实验4:队列的链式表示和实现要求:某小超市有两个排队机,构建2个用带头结点的单链表队列QA和QB, 实现下列操作1、初始化队列(清空);2、入队;3、出队;4、求队列长度;5、判断队列是否为空;6、判断队列是否为满;7、对于队列QA和QB,如果其中一个队列的售货员下班,则自动甩到另一个队列后面。*//* 存储形式 */typedef struct QNode{ //链队用的结点QElemType data;struct QNode *next;}QNode,*QueuePtr;typedef struct {QueuePtr front;QueuePtr rear;}LinkQueue;/* 初始化 */Status InitQueue(LinkQueue &queue) {queue.front = queue.rear = new QNode;queue.front->next = NULL;return OK;}/* 求队列长度 */Status QueueLength(LinkQueue &queue) {int count = 0;if (queue.rear == queue.front) {return count;}QueuePtr temp = queue.front;while (temp != queue.rear) {count++;temp = temp->next;}return count;}/* 入队 */Status EnQueue(LinkQueue &queue, QElemType e, int length) {if (QueueLength(queue) <length) {QueuePtr temp = new QNode;temp->data = e;temp->next = NULL;queue.rear->next = temp;queue.rear = temp;return OK;} else {cout << "队已经满了,不能再入元素了"<< "\n";return ERROR;}}/* 出队 */Status DeQueue(LinkQueue &queue) {if (queue.front == queue.rear) {return OVERFLOW;}// 有必要定义一个p,不然头结点会掉QueuePtr p = queue.front->next;QElemType e = p->data;queue.front->next = p->next;// 考虑最后一个元素被删,队尾指针指向头结点if (queue.rear == p) {queue.rear = queue.front;}return e;}/* 取队头元素 */// Status GetHead(LinkQueue &queue) {// if (queue.front != queue.rear){// return queue.front->next->data;// }// }/* 判断队列是否为空 */bool QueueIsEmpty(LinkQueue &queue) {if (queue.rear == queue.front) {return true;} else {return false;}}/*** 判断队列是否为满* 不是很理解为什么链队需要判断是否为满呢?* 采用输入链队长度,利用链队函数来判断* 那么入队的代码需要输入length参数来判断是否还能让元素入队*/bool QueueIsFull(LinkQueue &queue, int length) {if (QueueLength(queue) == length) {return true;} else {return false;}}/* 一个队列甩到另一个队列 */Status QueueMove(LinkQueue &queue_delete,LinkQueue &queue_add) {queue_add.rear->next = queue_delete.front->next;queue_add.rear = queue_delete.rear;return OK;}/* 遍历查看队列元素 */Status DisplayQueue(LinkQueue &queue) {LinkQueue L = queue;while (L.front->next != NULL) {cout << L.front->next->data << " ";L.front = L.front->next;}cout << "\n";return OK;}int main() {cout<<"------------------------链队菜单----------------------"<<'\n';cout<<"操作0:退出程序"<<'\n';cout<<"操作1:初始化两队列"<<'\n';cout<<"操作2:入队操作"<<'\n';cout<<"操作3:出队操作"<<'\n';cout<<"操作4:判断判断链队是否为空"<<'\n';cout<<"操作5:判断判断链队是否为满"<<'\n';cout<<"操作6:售货员偷懒选项"<<'\n';cout<<"操作7:查看队列"<<'\n';cout<<"操作8:求队列长度"<<'\n';cout<<"--------------------------------------------------------"<<'\n';int a, length,flag = 1;cout << "请输入你希望排队机最多能排的人数:"<<"\n"<<"\n";cin >> length;LinkQueue QA,QB;while(flag){cout<<'\n'<<"请选择要执行的操作:";while(cin>>a){if(a < 0 || a > 8)cout<<"请选择正确操作编号:";elsebreak;}switch(a){case 0:{cout<<"正在退出程序中……"<<'\n';flag = 0;break;}case 1:{cout<<"初始化QA、QB队列中……"<<'\n';InitQueue(QA);InitQueue(QB);break;}case 2:{cout<<"请输入入队的队列(QA输入1,QB输入2)"<<'\n';int select_queue;cin >> select_queue;if (select_queue == 1) {cout<<"请输入入QA队的队列的元素"<<'\n';int select_queue_A;cin >> select_queue_A;EnQueue(QA, select_queue_A, length);} else if (select_queue == 2) {cout<<"请输入入QB队的队列的元素"<<'\n';int select_queue_B;cin >> select_queue_B;EnQueue(QB, select_queue_B, length);} else {cout << "输入有误!"<< "\n";}break;}case 3:{cout<<"请输入需要出队的队列(QA输入1,QB输入2)"<<'\n';int select_queue;cin >> select_queue;if (select_queue == 1) {DeQueue(QA);} else if (select_queue == 2) {DeQueue(QB);} else {cout << "输入有误!"<< "\n";}break;}case 4:{cout<<"请输入需要判空的队列(QA输入1,QB输入2)"<<'\n';int select_queue;cin >> select_queue;if (select_queue == 1) {cout << "QA队列为空吗?"<< boolalpha << QueueIsEmpty(QA) << "\n";} else if (select_queue == 2) {cout << "QB队列为空吗?"<< boolalpha << QueueIsEmpty(QB) << "\n";} else {cout << "输入有误!"<< "\n";}break;}case 5:{cout<<"请输入需要判满的队列(QA输入1,QB输入2)"<<'\n';int select_queue;cin >> select_queue;if (select_queue == 1) {cout << "QA队列为满吗?"<< boolalpha << QueueIsFull(QA,length) << "\n";} else if (select_queue == 2) {cout << "QB队列为满吗?"<< boolalpha << QueueIsFull(QB,length) << "\n";} else {cout << "输入有误!"<< "\n";}break;}case 6:{cout<<"请输入下班的售货员(QA输入1,QB输入2)"<<'\n';int select_queue;cin >> select_queue;if (select_queue == 1) {QueueMove(QA, QB);} else if (select_queue == 2) {QueueMove(QB, QA);} else {cout << "输入有误!"<< "\n";}break;}case 7:{cout<<"请输入要查看的队列(QA输入1,QB输入2)"<<'\n';int select_queue;cin >> select_queue;if (select_queue == 1) {DisplayQueue(QA);} else if (select_queue == 2) {DisplayQueue(QB);} else {cout << "输入有误!"<< "\n";}break;}case 8:{cout<<"请输入要查看的队列的长度(QA输入1,QB输入2)"<<'\n';int select_queue;cin >> select_queue;if (select_queue == 1) {cout<<QueueLength(QA)<< "\n";} else if (select_queue == 2) {cout<<QueueLength(QB)<< "\n";} else {cout << "输入有误!"<< "\n";}break;}}}}
