实验任务

  1. 实验4:队列的链式表示和实现<br /> 要求:某小超市有两个排队机,构建2个用带头结点的单链表队列QAQB, 实现下列操作<br /> 1、初始化队列(清空);<br /> 2、入队;<br /> 3、出队;<br /> 4、求队列长度;<br /> 5、判断队列是否为空;<br /> 6、判断队列是否为满;<br /> 7、对于队列QAQB,如果其中一个队列的售货员下班,则自动甩到另一个队列后面。<br />截止日期:422

实验讨论

:::info 觉得问题里面有bug :::

对问题判满的疑惑与解决,第六个问题对链对判满是否有意义,如果是链式存储,数据结构本身判断满没有意义,但是考虑到是小型超市,超市空间不大,所以对其进行一开始的用户自己输入两个队列的最大长度。

但是这样又有一个问题,在问题7中,如果一个队列的售货员下班了,这个队列的所有人排到另一个队列中,那如果新队列的长度超出用户输入的队列最大长度呢?考虑到实际问题,这个问题不打算解决了,让他们挤挤……

代码代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef int Status;
  4. typedef int QElemType;
  5. #define OVERFLOW -1
  6. #define ERROR 0
  7. #define OK 1
  8. /**
  9. 实验4:队列的链式表示和实现
  10. 要求:某小超市有两个排队机,构建2个用带头结点的单链表队列QA和QB, 实现下列操作
  11. 1、初始化队列(清空);
  12. 2、入队;
  13. 3、出队;
  14. 4、求队列长度;
  15. 5、判断队列是否为空;
  16. 6、判断队列是否为满;
  17. 7、对于队列QA和QB,如果其中一个队列的售货员下班,则自动甩到另一个队列后面。
  18. */
  19. /* 存储形式 */
  20. typedef struct QNode{ //链队用的结点
  21. QElemType data;
  22. struct QNode *next;
  23. }QNode,*QueuePtr;
  24. typedef struct {
  25. QueuePtr front;
  26. QueuePtr rear;
  27. }LinkQueue;
  28. /* 初始化 */
  29. Status InitQueue(LinkQueue &queue) {
  30. queue.front = queue.rear = new QNode;
  31. queue.front->next = NULL;
  32. return OK;
  33. }
  34. /* 求队列长度 */
  35. Status QueueLength(LinkQueue &queue) {
  36. int count = 0;
  37. if (queue.rear == queue.front) {
  38. return count;
  39. }
  40. QueuePtr temp = queue.front;
  41. while (temp != queue.rear) {
  42. count++;
  43. temp = temp->next;
  44. }
  45. return count;
  46. }
  47. /* 入队 */
  48. Status EnQueue(LinkQueue &queue, QElemType e, int length) {
  49. if (QueueLength(queue) <length) {
  50. QueuePtr temp = new QNode;
  51. temp->data = e;
  52. temp->next = NULL;
  53. queue.rear->next = temp;
  54. queue.rear = temp;
  55. return OK;
  56. } else {
  57. cout << "队已经满了,不能再入元素了"<< "\n";
  58. return ERROR;
  59. }
  60. }
  61. /* 出队 */
  62. Status DeQueue(LinkQueue &queue) {
  63. if (queue.front == queue.rear) {
  64. return OVERFLOW;
  65. }
  66. // 有必要定义一个p,不然头结点会掉
  67. QueuePtr p = queue.front->next;
  68. QElemType e = p->data;
  69. queue.front->next = p->next;
  70. // 考虑最后一个元素被删,队尾指针指向头结点
  71. if (queue.rear == p) {
  72. queue.rear = queue.front;
  73. }
  74. return e;
  75. }
  76. /* 取队头元素 */
  77. // Status GetHead(LinkQueue &queue) {
  78. // if (queue.front != queue.rear){
  79. // return queue.front->next->data;
  80. // }
  81. // }
  82. /* 判断队列是否为空 */
  83. bool QueueIsEmpty(LinkQueue &queue) {
  84. if (queue.rear == queue.front) {
  85. return true;
  86. } else {
  87. return false;
  88. }
  89. }
  90. /**
  91. * 判断队列是否为满
  92. * 不是很理解为什么链队需要判断是否为满呢?
  93. * 采用输入链队长度,利用链队函数来判断
  94. * 那么入队的代码需要输入length参数来判断是否还能让元素入队
  95. */
  96. bool QueueIsFull(LinkQueue &queue, int length) {
  97. if (QueueLength(queue) == length) {
  98. return true;
  99. } else {
  100. return false;
  101. }
  102. }
  103. /* 一个队列甩到另一个队列 */
  104. Status QueueMove(LinkQueue &queue_delete,LinkQueue &queue_add) {
  105. queue_add.rear->next = queue_delete.front->next;
  106. queue_add.rear = queue_delete.rear;
  107. return OK;
  108. }
  109. /* 遍历查看队列元素 */
  110. Status DisplayQueue(LinkQueue &queue) {
  111. LinkQueue L = queue;
  112. while (L.front->next != NULL) {
  113. cout << L.front->next->data << " ";
  114. L.front = L.front->next;
  115. }
  116. cout << "\n";
  117. return OK;
  118. }
  119. int main() {
  120. cout<<"------------------------链队菜单----------------------"<<'\n';
  121. cout<<"操作0:退出程序"<<'\n';
  122. cout<<"操作1:初始化两队列"<<'\n';
  123. cout<<"操作2:入队操作"<<'\n';
  124. cout<<"操作3:出队操作"<<'\n';
  125. cout<<"操作4:判断判断链队是否为空"<<'\n';
  126. cout<<"操作5:判断判断链队是否为满"<<'\n';
  127. cout<<"操作6:售货员偷懒选项"<<'\n';
  128. cout<<"操作7:查看队列"<<'\n';
  129. cout<<"操作8:求队列长度"<<'\n';
  130. cout<<"--------------------------------------------------------"<<'\n';
  131. int a, length,flag = 1;
  132. cout << "请输入你希望排队机最多能排的人数:"<<"\n"<<"\n";
  133. cin >> length;
  134. LinkQueue QA,QB;
  135. while(flag)
  136. {
  137. cout<<'\n'<<"请选择要执行的操作:";
  138. while(cin>>a)
  139. {
  140. if(a < 0 || a > 8)
  141. cout<<"请选择正确操作编号:";
  142. else
  143. break;
  144. }
  145. switch(a)
  146. {
  147. case 0:
  148. {
  149. cout<<"正在退出程序中……"<<'\n';
  150. flag = 0;
  151. break;
  152. }
  153. case 1:
  154. {
  155. cout<<"初始化QA、QB队列中……"<<'\n';
  156. InitQueue(QA);
  157. InitQueue(QB);
  158. break;
  159. }
  160. case 2:
  161. {
  162. cout<<"请输入入队的队列(QA输入1,QB输入2)"<<'\n';
  163. int select_queue;
  164. cin >> select_queue;
  165. if (select_queue == 1) {
  166. cout<<"请输入入QA队的队列的元素"<<'\n';
  167. int select_queue_A;
  168. cin >> select_queue_A;
  169. EnQueue(QA, select_queue_A, length);
  170. } else if (select_queue == 2) {
  171. cout<<"请输入入QB队的队列的元素"<<'\n';
  172. int select_queue_B;
  173. cin >> select_queue_B;
  174. EnQueue(QB, select_queue_B, length);
  175. } else {
  176. cout << "输入有误!"<< "\n";
  177. }
  178. break;
  179. }
  180. case 3:
  181. {
  182. cout<<"请输入需要出队的队列(QA输入1,QB输入2)"<<'\n';
  183. int select_queue;
  184. cin >> select_queue;
  185. if (select_queue == 1) {
  186. DeQueue(QA);
  187. } else if (select_queue == 2) {
  188. DeQueue(QB);
  189. } else {
  190. cout << "输入有误!"<< "\n";
  191. }
  192. break;
  193. }
  194. case 4:
  195. {
  196. cout<<"请输入需要判空的队列(QA输入1,QB输入2)"<<'\n';
  197. int select_queue;
  198. cin >> select_queue;
  199. if (select_queue == 1) {
  200. cout << "QA队列为空吗?"<< boolalpha << QueueIsEmpty(QA) << "\n";
  201. } else if (select_queue == 2) {
  202. cout << "QB队列为空吗?"<< boolalpha << QueueIsEmpty(QB) << "\n";
  203. } else {
  204. cout << "输入有误!"<< "\n";
  205. }
  206. break;
  207. }
  208. case 5:
  209. {
  210. cout<<"请输入需要判满的队列(QA输入1,QB输入2)"<<'\n';
  211. int select_queue;
  212. cin >> select_queue;
  213. if (select_queue == 1) {
  214. cout << "QA队列为满吗?"<< boolalpha << QueueIsFull(QA,length) << "\n";
  215. } else if (select_queue == 2) {
  216. cout << "QB队列为满吗?"<< boolalpha << QueueIsFull(QB,length) << "\n";
  217. } else {
  218. cout << "输入有误!"<< "\n";
  219. }
  220. break;
  221. }
  222. case 6:
  223. {
  224. cout<<"请输入下班的售货员(QA输入1,QB输入2)"<<'\n';
  225. int select_queue;
  226. cin >> select_queue;
  227. if (select_queue == 1) {
  228. QueueMove(QA, QB);
  229. } else if (select_queue == 2) {
  230. QueueMove(QB, QA);
  231. } else {
  232. cout << "输入有误!"<< "\n";
  233. }
  234. break;
  235. }
  236. case 7:
  237. {
  238. cout<<"请输入要查看的队列(QA输入1,QB输入2)"<<'\n';
  239. int select_queue;
  240. cin >> select_queue;
  241. if (select_queue == 1) {
  242. DisplayQueue(QA);
  243. } else if (select_queue == 2) {
  244. DisplayQueue(QB);
  245. } else {
  246. cout << "输入有误!"<< "\n";
  247. }
  248. break;
  249. }
  250. case 8:
  251. {
  252. cout<<"请输入要查看的队列的长度(QA输入1,QB输入2)"<<'\n';
  253. int select_queue;
  254. cin >> select_queue;
  255. if (select_queue == 1) {
  256. cout<<QueueLength(QA)<< "\n";
  257. } else if (select_queue == 2) {
  258. cout<<QueueLength(QB)<< "\n";
  259. } else {
  260. cout << "输入有误!"<< "\n";
  261. }
  262. break;
  263. }
  264. }
  265. }
  266. }