一、循环队列

  1. #include <iostream>
  2. using namespace std;
  3. #define MAXQSIZE 100
  4. typedef struct {
  5. int* base;//存储空间的基地址
  6. int front;//头指针
  7. int rear;//尾指针
  8. }SqQueue;
  9.  
  10. //初始化队列 构造一个空队列Q
  11. void InitQueue(SqQueue& Q) {
  12. Q.base = new int[MAXQSIZE];//为队列分配一个最大容量为MAXQSIZE的数组空间
  13. if (!Q.base) exit(OVERFLOW);//存储分配失败
  14. Q.front = Q.rear = 0;//将0赋值给头指针和尾指针,表示队列为空
  15. }
  16. //入队,e为插入的元素
  17. bool EnQueue(SqQueue& Q, int e) {
  18. if ((Q.rear + 1) % MAXQSIZE == Q.front) return false;//尾指针在循环意义上加1后等于头指针,表示队满
  19. Q.base[Q.rear] = e;//e插入队尾
  20. Q.rear = (Q.rear + 1) % MAXQSIZE;//队尾指针加1.如果超过100则从0重新计数
  21. return true;
  22. }
  23. //出队,删除队列Q的队头元素,用e返回其值
  24. bool DeQueue(SqQueue& Q, int &e) {
  25. if (Q.front == Q.rear) return false;//队空
  26. e = Q.base[Q.front];//将队头元素赋值给e
  27. Q.front = (Q.front + 1) % MAXQSIZE;//队头指针加一
  28. return true;
  29. }
  30. //取队头元素
  31. int GetHead(SqQueue Q) {
  32. //当队列不为空时,返回队列头元素
  33. if (Q.front != Q.rear)
  34. return Q.base[Q.front];
  35. return NULL;
  36. }
  37. //返回队列Q的元素个数
  38. int QueueLength(SqQueue Q) {
  39. return(Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
  40. }
  41. //批量入队(这里默认不会超过最大元素数MAXQSIZE)
  42. void QueueInput(SqQueue& Q) {
  43. int value;//用户输入的值
  44. int n = 0;//输入数据的个数
  45. cout << "你想要输入几个数据?" << endl;
  46. cin >> n;
  47. for (int i = 0; i < n; i++) {
  48. cout << "请输入第" << i + 1 << "个数据:";
  49. cin >> value;//输入元素值
  50. if(EnQueue(Q,value)) cout << "入队成功!" << endl;
  51. else cout << "入队失败!";
  52. }
  53. }
  54. //依次出队
  55. void QueueOut(SqQueue& Q) {
  56. int value;
  57. cout << "依次出队的值为:\n";
  58. while (DeQueue(Q, value))
  59. cout << value<<"\t";
  60. }
  61.  
  62. int main()
  63. {
  64. int opearateNum = 0;//操作值
  65. SqQueue Q;
  66. InitQueue(Q);
  67. while (true)
  68. {
  69. cout << "1、批量入队\t2、全部依次出队\t3、取队头元素值\t4、出队\t5、队列元素个数\t6、退出" << endl;
  70. cin >> opearateNum;
  71. if (opearateNum == 6)
  72. break;
  73. switch (opearateNum)
  74. {
  75. case 1:
  76. //数据输入
  77. QueueInput(Q);
  78. system("pause");
  79. system("cls");
  80. break;
  81. case 2:
  82. //依次出队
  83. QueueOut(Q);
  84. system("pause");
  85. system("cls");
  86. break;
  87. case 3:
  88. if (Q.rear == Q.front)
  89. cout << "队列无元素" << endl;
  90. else
  91. cout << "队头元素值为:" << GetHead(Q) << endl;
  92. system("pause");
  93. system("cls");
  94. break;
  95. case 4:
  96. int value;//出队的值
  97. cout << "出队的元素值为:";
  98. if (!DeQueue(Q,value))
  99. cout << "队列无元素!" << endl;
  100. else
  101. cout << value << endl;
  102. system("pause");
  103. system("cls");
  104. break;
  105. case 5:
  106. cout << "队列共有" << QueueLength(Q) << "个元素" << endl;
  107. system("pause");
  108. system("cls");
  109. break;
  110. default:
  111. cout << "无效操作,请重新输入!" << endl;
  112. break;
  113. }
  114.  
  115. }
  116. }

  二、链队

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. typedef struct QNode {
  5. int data;
  6. struct QNode* next;
  7. }*QueuePtr;
  8. typedef struct {
  9. QueuePtr front;//队头指针
  10. QueuePtr rear;//队尾指针
  11. }LinkQueue;
  12.  
  13. //初始化队列 构造空的队列
  14. void InitQueue(LinkQueue& Q) {
  15. Q.front = Q.rear = new QNode;//生成新结点作为头结点,队头和队尾指针指向此结点
  16. Q.front->next = NULL;//头结点的指针域置空
  17. }
  18.  
  19. //入队 插入元素e为队列Q的新的队尾元素
  20. bool EnQueue(LinkQueue& Q, int e) {
  21. QNode* p = new QNode;//为入队元素分配结点空间,用指针p指向
  22. p->data = e;//将新结点数据域置为e
  23. p->next = NULL;
  24. Q.rear->next = p;//将新结点插入到队尾
  25. Q.rear = p;//修改队尾指针
  26. return true;
  27. }
  28.  
  29. //出队 删除队列Q的队头元素,用e返回其值
  30. bool DeQueue(LinkQueue& Q, int &e) {
  31. if (Q.front == Q.rear) return false;//若队列为空,则返回false
  32. QNode* p = Q.front->next;//生成新结点p指向队头元素
  33. e = p->data;//e保存队头元素的值
  34. Q.front->next = p->next;//修改头结点的指针域
  35. if (Q.rear == p) Q.rear = Q.front;//如果只有一个元素则将队尾指针指向头结点
  36. delete p;//释放队头元素的空间
  37. return true;
  38. }
  39.  
  40. //取队头元素
  41. int GetHead(LinkQueue Q) {
  42. if (Q.front != Q.rear)//队列不为空
  43. return Q.front->next->data;//返回队头元素的值
  44. }
  45.  
  46. //批量入队(这里默认不会超过最大元素数MAXQSIZE)
  47. void QueueInput(LinkQueue& Q) {
  48. int value;//用户输入的值
  49. int n = 0;//输入数据的个数
  50. cout << "你想要输入几个数据?" << endl;
  51. cin >> n;
  52. for (int i = 0; i < n; i++) {
  53. cout << "请输入第" << i + 1 << "个数据:";
  54. cin >> value;//输入元素值
  55. if (EnQueue(Q, value)) cout << "入队成功!" << endl;
  56. else cout << "入队失败!";
  57. }
  58. }
  59. //依次出队
  60. void QueueOut(LinkQueue& Q) {
  61. int value;
  62. cout << "依次出队的值为:\n";
  63. while (DeQueue(Q, value))
  64. cout << value << "\t";
  65. }
  66. int main()
  67. {
  68. int opearateNum = 0;//操作值
  69. LinkQueue Q;
  70. InitQueue(Q);
  71. while (true)
  72. {
  73. cout << "1、批量入队\t2、全部依次出队\t3、取队头元素值\t4、出队\t5、入队\t6、退出" << endl;
  74. cin >> opearateNum;
  75. if (opearateNum == 6)
  76. break;
  77. switch (opearateNum)
  78. {
  79. case 1:
  80. //数据输入
  81. QueueInput(Q);
  82. system("pause");
  83. system("cls");
  84. break;
  85. case 2:
  86. //依次出队
  87. QueueOut(Q);
  88. system("pause");
  89. system("cls");
  90. break;
  91. case 3:
  92. if (Q.rear == Q.front)
  93. cout << "队列无元素" << endl;
  94. else
  95. cout << "队头元素值为:" << GetHead(Q) << endl;
  96. system("pause");
  97. system("cls");
  98. break;
  99. case 4:
  100. int value;//出队的值
  101. cout << "出队的元素值为:";
  102. if (!DeQueue(Q,value))
  103. cout << "队列无元素!" << endl;
  104. else
  105. cout << value << endl;
  106. system("pause");
  107. system("cls");
  108. break;
  109. case 5:
  110. int e;//用户输入的值
  111. cout << "请输入入队的值:";
  112. cin >> e;
  113. if (EnQueue(Q, e))
  114. cout << "入队成功!" << endl;
  115. else
  116. cout << "入队失败!" << endl;
  117. system("pause");
  118. system("cls");
  119. break;
  120. default:
  121. cout << "无效操作,请重新输入!" << endl;
  122. break;
  123. }
  124.  
  125. }
  126. }

  

C++学习---队列的构建及操作的更多相关文章

  1. C++学习---栈的构建及操作

    一.顺序栈 #include <iostream> using namespace std; #define MAXSIZE 100 //栈的最大容量 typedef struct { i ...

  2. 深度学习之TensorFlow构建神经网络层

    深度学习之TensorFlow构建神经网络层 基本法 深度神经网络是一个多层次的网络模型,包含了:输入层,隐藏层和输出层,其中隐藏层是最重要也是深度最多的,通过TensorFlow,python代码可 ...

  3. 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式

    本系列文章导航 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 一.摘要 本篇文章讲解如何使用jQuery获取和操作元素的属性和CSS样式. 其中DOM属性和元素属性的区分值得 ...

  4. 【php学习之路】字符串操作

           无论学习那种语言,字符串操作都是必备的基础.学php的时候总是会不知不觉的与C#比较,用起来总觉得怪怪的没有那么顺手,有些命名也差别很大,再加上很多函数命名是简写形式不百度下还真不知道什 ...

  5. RX学习笔记:JavaScript数组操作

    RX学习笔记:JavaScript数组操作 2016-07-03 增删元素 unshift() 在数组开关添加元素 array.unshift("value"); array.un ...

  6. java PriorityBlockingQueue 基于优先级队列,的读出操作可以阻止.

    java PriorityBlockingQueue 基于优先级队列.的读出操作可以阻止. package org.rui.thread.newc; import java.util.ArrayLis ...

  7. 树莓派学习笔记——使用文件IO操作GPIO SysFs方式

    0 前言     本文描写叙述假设通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先訪问/sys/class/gpio文件夹,向export文件写入GPIO编号, ...

  8. Windows phone 8 学习笔记(2) 数据文件操作

    原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...

  9. IOS开发-UI学习-sqlite数据库的操作

    IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...

随机推荐

  1. java 多线程-3

    十.同步机制解决Thread继承安全问题 创建三个窗口买票,共100张票.用继承来实现 方式一:同步代码块 public class RunMainExtends { public static vo ...

  2. (数据科学学习手札95)elyra——jupyter lab平台最强插件集

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 jupyter lab是我最喜欢的编辑器,在过往 ...

  3. 关于弹性布局flex

    什么时候使用flex布局? 当页面排版涉及左右浮动.垂直居中等时,应使用flex布局来避免传统的盒式布局带来的一些Bug. 如何使用flex布局? 在目标元素的父元素设置csss属性.display: ...

  4. nioServerChannel的的状态

    转载自https://blog.csdn.net/zxhoo/article/details/17964353 Channel继承层次图分析上面提到的三个状态的时候,会去看Channel继承层次里某些 ...

  5. zookeeper(3) 持久化

    zookeeper为了防止,系统宕机或重启导致的数据丢失,会对数据进行定时持久化.有两种持久化方式: 1.为每次事务操作记录到日志文件,这样就可以通过执行这些日志文件来恢复数据. 2.为了加快ZooK ...

  6. 简单聊聊 Ironic

    上一篇文章里我简单介绍了一下「裸金属」的概念,提到了 OpenStack 中的核心项目 Ironic,今天简单来聊聊它. Ironic 项目的吉祥物 Bare Metal 所以用 Bear 来做吉祥物 ...

  7. python下的appium控制andriod按键

    今天查看视频的时候,发现不好控制关闭视频,于是就想控制手机的返回按键来达到返回的效果. 找到了一些关于按键的keycode,如下: KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL ...

  8. 【小白学PyTorch】17 TFrec文件的创建与读取

    [新闻]:机器学习炼丹术的粉丝的人工智能交流群已经建立,目前有目标检测.医学图像.时间序列等多个目标为技术学习的分群和水群唠嗑的总群,欢迎大家加炼丹兄为好友,加入炼丹协会.微信:cyx64501661 ...

  9. Linux下彻底删除安装的rpm包

    如何彻底Linux系统下安装的rpm包?现以mySQL为例进行介绍: 一.使用以下命令查看mysql安装情况 [root@xpq mysql]# rpm -qa|grep -i mysql MySQL ...

  10. C1853 编译器错误:fatal error C1853: 'pjtname.pch' precompiled header file is from a previous

    转载:https://www.cnblogs.com/emanlee/archive/2010/10/16/1852998.html 用VC++ 2008 编写C语言程序,编译出现错误: 预编译头文件 ...