C++学习---队列的构建及操作
一、循环队列
- #include <iostream>
- using namespace std;
- #define MAXQSIZE 100
- typedef struct {
- int* base;//存储空间的基地址
- int front;//头指针
- int rear;//尾指针
- }SqQueue;
- //初始化队列 构造一个空队列Q
- void InitQueue(SqQueue& Q) {
- Q.base = new int[MAXQSIZE];//为队列分配一个最大容量为MAXQSIZE的数组空间
- if (!Q.base) exit(OVERFLOW);//存储分配失败
- Q.front = Q.rear = 0;//将0赋值给头指针和尾指针,表示队列为空
- }
- //入队,e为插入的元素
- bool EnQueue(SqQueue& Q, int e) {
- if ((Q.rear + 1) % MAXQSIZE == Q.front) return false;//尾指针在循环意义上加1后等于头指针,表示队满
- Q.base[Q.rear] = e;//e插入队尾
- Q.rear = (Q.rear + 1) % MAXQSIZE;//队尾指针加1.如果超过100则从0重新计数
- return true;
- }
- //出队,删除队列Q的队头元素,用e返回其值
- bool DeQueue(SqQueue& Q, int &e) {
- if (Q.front == Q.rear) return false;//队空
- e = Q.base[Q.front];//将队头元素赋值给e
- Q.front = (Q.front + 1) % MAXQSIZE;//队头指针加一
- return true;
- }
- //取队头元素
- int GetHead(SqQueue Q) {
- //当队列不为空时,返回队列头元素
- if (Q.front != Q.rear)
- return Q.base[Q.front];
- return NULL;
- }
- //返回队列Q的元素个数
- int QueueLength(SqQueue Q) {
- return(Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
- }
- //批量入队(这里默认不会超过最大元素数MAXQSIZE)
- void QueueInput(SqQueue& Q) {
- int value;//用户输入的值
- int n = 0;//输入数据的个数
- cout << "你想要输入几个数据?" << endl;
- cin >> n;
- for (int i = 0; i < n; i++) {
- cout << "请输入第" << i + 1 << "个数据:";
- cin >> value;//输入元素值
- if(EnQueue(Q,value)) cout << "入队成功!" << endl;
- else cout << "入队失败!";
- }
- }
- //依次出队
- void QueueOut(SqQueue& Q) {
- int value;
- cout << "依次出队的值为:\n";
- while (DeQueue(Q, value))
- cout << value<<"\t";
- }
- int main()
- {
- int opearateNum = 0;//操作值
- SqQueue Q;
- InitQueue(Q);
- while (true)
- {
- cout << "1、批量入队\t2、全部依次出队\t3、取队头元素值\t4、出队\t5、队列元素个数\t6、退出" << endl;
- cin >> opearateNum;
- if (opearateNum == 6)
- break;
- switch (opearateNum)
- {
- case 1:
- //数据输入
- QueueInput(Q);
- system("pause");
- system("cls");
- break;
- case 2:
- //依次出队
- QueueOut(Q);
- system("pause");
- system("cls");
- break;
- case 3:
- if (Q.rear == Q.front)
- cout << "队列无元素" << endl;
- else
- cout << "队头元素值为:" << GetHead(Q) << endl;
- system("pause");
- system("cls");
- break;
- case 4:
- int value;//出队的值
- cout << "出队的元素值为:";
- if (!DeQueue(Q,value))
- cout << "队列无元素!" << endl;
- else
- cout << value << endl;
- system("pause");
- system("cls");
- break;
- case 5:
- cout << "队列共有" << QueueLength(Q) << "个元素" << endl;
- system("pause");
- system("cls");
- break;
- default:
- cout << "无效操作,请重新输入!" << endl;
- break;
- }
- }
- }
二、链队
- #include <iostream>
- using namespace std;
- typedef struct QNode {
- int data;
- struct QNode* next;
- }*QueuePtr;
- typedef struct {
- QueuePtr front;//队头指针
- QueuePtr rear;//队尾指针
- }LinkQueue;
- //初始化队列 构造空的队列
- void InitQueue(LinkQueue& Q) {
- Q.front = Q.rear = new QNode;//生成新结点作为头结点,队头和队尾指针指向此结点
- Q.front->next = NULL;//头结点的指针域置空
- }
- //入队 插入元素e为队列Q的新的队尾元素
- bool EnQueue(LinkQueue& Q, int e) {
- QNode* p = new QNode;//为入队元素分配结点空间,用指针p指向
- p->data = e;//将新结点数据域置为e
- p->next = NULL;
- Q.rear->next = p;//将新结点插入到队尾
- Q.rear = p;//修改队尾指针
- return true;
- }
- //出队 删除队列Q的队头元素,用e返回其值
- bool DeQueue(LinkQueue& Q, int &e) {
- if (Q.front == Q.rear) return false;//若队列为空,则返回false
- QNode* p = Q.front->next;//生成新结点p指向队头元素
- e = p->data;//e保存队头元素的值
- Q.front->next = p->next;//修改头结点的指针域
- if (Q.rear == p) Q.rear = Q.front;//如果只有一个元素则将队尾指针指向头结点
- delete p;//释放队头元素的空间
- return true;
- }
- //取队头元素
- int GetHead(LinkQueue Q) {
- if (Q.front != Q.rear)//队列不为空
- return Q.front->next->data;//返回队头元素的值
- }
- //批量入队(这里默认不会超过最大元素数MAXQSIZE)
- void QueueInput(LinkQueue& Q) {
- int value;//用户输入的值
- int n = 0;//输入数据的个数
- cout << "你想要输入几个数据?" << endl;
- cin >> n;
- for (int i = 0; i < n; i++) {
- cout << "请输入第" << i + 1 << "个数据:";
- cin >> value;//输入元素值
- if (EnQueue(Q, value)) cout << "入队成功!" << endl;
- else cout << "入队失败!";
- }
- }
- //依次出队
- void QueueOut(LinkQueue& Q) {
- int value;
- cout << "依次出队的值为:\n";
- while (DeQueue(Q, value))
- cout << value << "\t";
- }
- int main()
- {
- int opearateNum = 0;//操作值
- LinkQueue Q;
- InitQueue(Q);
- while (true)
- {
- cout << "1、批量入队\t2、全部依次出队\t3、取队头元素值\t4、出队\t5、入队\t6、退出" << endl;
- cin >> opearateNum;
- if (opearateNum == 6)
- break;
- switch (opearateNum)
- {
- case 1:
- //数据输入
- QueueInput(Q);
- system("pause");
- system("cls");
- break;
- case 2:
- //依次出队
- QueueOut(Q);
- system("pause");
- system("cls");
- break;
- case 3:
- if (Q.rear == Q.front)
- cout << "队列无元素" << endl;
- else
- cout << "队头元素值为:" << GetHead(Q) << endl;
- system("pause");
- system("cls");
- break;
- case 4:
- int value;//出队的值
- cout << "出队的元素值为:";
- if (!DeQueue(Q,value))
- cout << "队列无元素!" << endl;
- else
- cout << value << endl;
- system("pause");
- system("cls");
- break;
- case 5:
- int e;//用户输入的值
- cout << "请输入入队的值:";
- cin >> e;
- if (EnQueue(Q, e))
- cout << "入队成功!" << endl;
- else
- cout << "入队失败!" << endl;
- system("pause");
- system("cls");
- break;
- default:
- cout << "无效操作,请重新输入!" << endl;
- break;
- }
- }
- }
C++学习---队列的构建及操作的更多相关文章
- C++学习---栈的构建及操作
一.顺序栈 #include <iostream> using namespace std; #define MAXSIZE 100 //栈的最大容量 typedef struct { i ...
- 深度学习之TensorFlow构建神经网络层
深度学习之TensorFlow构建神经网络层 基本法 深度神经网络是一个多层次的网络模型,包含了:输入层,隐藏层和输出层,其中隐藏层是最重要也是深度最多的,通过TensorFlow,python代码可 ...
- 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式
本系列文章导航 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 一.摘要 本篇文章讲解如何使用jQuery获取和操作元素的属性和CSS样式. 其中DOM属性和元素属性的区分值得 ...
- 【php学习之路】字符串操作
无论学习那种语言,字符串操作都是必备的基础.学php的时候总是会不知不觉的与C#比较,用起来总觉得怪怪的没有那么顺手,有些命名也差别很大,再加上很多函数命名是简写形式不百度下还真不知道什 ...
- RX学习笔记:JavaScript数组操作
RX学习笔记:JavaScript数组操作 2016-07-03 增删元素 unshift() 在数组开关添加元素 array.unshift("value"); array.un ...
- java PriorityBlockingQueue 基于优先级队列,的读出操作可以阻止.
java PriorityBlockingQueue 基于优先级队列.的读出操作可以阻止. package org.rui.thread.newc; import java.util.ArrayLis ...
- 树莓派学习笔记——使用文件IO操作GPIO SysFs方式
0 前言 本文描写叙述假设通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先訪问/sys/class/gpio文件夹,向export文件写入GPIO编号, ...
- Windows phone 8 学习笔记(2) 数据文件操作
原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...
- IOS开发-UI学习-sqlite数据库的操作
IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...
随机推荐
- java 多线程-3
十.同步机制解决Thread继承安全问题 创建三个窗口买票,共100张票.用继承来实现 方式一:同步代码块 public class RunMainExtends { public static vo ...
- (数据科学学习手札95)elyra——jupyter lab平台最强插件集
本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 jupyter lab是我最喜欢的编辑器,在过往 ...
- 关于弹性布局flex
什么时候使用flex布局? 当页面排版涉及左右浮动.垂直居中等时,应使用flex布局来避免传统的盒式布局带来的一些Bug. 如何使用flex布局? 在目标元素的父元素设置csss属性.display: ...
- nioServerChannel的的状态
转载自https://blog.csdn.net/zxhoo/article/details/17964353 Channel继承层次图分析上面提到的三个状态的时候,会去看Channel继承层次里某些 ...
- zookeeper(3) 持久化
zookeeper为了防止,系统宕机或重启导致的数据丢失,会对数据进行定时持久化.有两种持久化方式: 1.为每次事务操作记录到日志文件,这样就可以通过执行这些日志文件来恢复数据. 2.为了加快ZooK ...
- 简单聊聊 Ironic
上一篇文章里我简单介绍了一下「裸金属」的概念,提到了 OpenStack 中的核心项目 Ironic,今天简单来聊聊它. Ironic 项目的吉祥物 Bare Metal 所以用 Bear 来做吉祥物 ...
- python下的appium控制andriod按键
今天查看视频的时候,发现不好控制关闭视频,于是就想控制手机的返回按键来达到返回的效果. 找到了一些关于按键的keycode,如下: KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL ...
- 【小白学PyTorch】17 TFrec文件的创建与读取
[新闻]:机器学习炼丹术的粉丝的人工智能交流群已经建立,目前有目标检测.医学图像.时间序列等多个目标为技术学习的分群和水群唠嗑的总群,欢迎大家加炼丹兄为好友,加入炼丹协会.微信:cyx64501661 ...
- Linux下彻底删除安装的rpm包
如何彻底Linux系统下安装的rpm包?现以mySQL为例进行介绍: 一.使用以下命令查看mysql安装情况 [root@xpq mysql]# rpm -qa|grep -i mysql MySQL ...
- 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语言程序,编译出现错误: 预编译头文件 ...