一、循环队列

#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++学习---队列的构建及操作的更多相关文章

  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. OneNote代码高亮完美解决方案(全网最全)

    0. 引子 OneNote作为一款记笔记的软件,免费实用,有助于自己形成树状结构知识框架.但是它有一个令人头疼的问题就是:无法代码高亮.而NoteHightlight2016正是解决这个问题的完美利器 ...

  2. netty全局分析1

    这个系列都是别人的分析文 https://www.jianshu.com/p/ac7fb5c2640f 一丶 Netty基础入门 Netty是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.U ...

  3. 面试题总结:可能是全网最好的MySQL重要知识点

    标题有点标题党的意思,但希望你在看了文章之后不会有这个想法--这篇文章是作者对之前总结的 MySQL 知识点做了完善后的产物,可以用来回顾MySQL基础知识以及备战MySQL常见面试问题. 什么是My ...

  4. thinkphp上传图片,生成缩略图

    Image.php <?php /** * 实现图片上传,图片缩小, 增加水印 * 需要定义以下常量 * define('ERR_INVALID_IMAGE', 1); * define('ER ...

  5. python 魔法方法诠释

    什么是Python魔法方法 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两个下划线包围来命名的(比如 ini ...

  6. 浅谈 Java线程状态转换及控制

    线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)这五 ...

  7. PCA基本原理

    降维问题的优化目标:将一组N维向量降维k维(K大于0,小于N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后, 选择然数据点之间方差最大的方向作为坐标轴 各字段两两间协方差为0, ...

  8. 多线程之ReentrantLock篇(五)

    昨天有说过后面讲ReentrantLock,今天我们这篇幅就全局的讲解下,我们在Lock出来前,解决并发问题没得选只能用Synchronized. 一.ReentrantLock PK synchro ...

  9. 【Python】类

    初探类 类定义与函数定义( def语句 )一样必须被执行才会起作用 调用 x.f() 其实就相当于 MyClass.f(x) 补充说明 数据属性会覆盖掉具有相同名称的方法属性 命名方法 方法名称使用大 ...

  10. 联赛模拟测试10 C. 射手座之日

    题目描述 分析 方法一(线段树) 线段树维护的是以当前节点为左端点的区间的贡献 而区间的右端点则会从 \(1\) 到 \(n\) 逐渐右移 当我们把右端点从 \(i-1\) 的位置扩展到 \(i\) ...