栈&队列
队列部分
普通队列
举个形象的例子:排队买票。
有一列人在排队买票,前面来的人买完票就离开,后面来的人需要站在最后……依次类推。
在计算机中,数据结构队列有一个头指针和尾指针,头指针加一就代表有一个数据出队了(人买完票),尾指针加一就代表有一共数据入队了。
队列,是一种线性表结构。它的主体是一个数组,第一个队内元素所在的位置叫做队首,而最后一个元素所在的位置叫做队尾。队列允许在队首队尾进行操作。因此,队列具有一个特殊而重要的性质FIFO(先进先出)。
普通队列大概是这个样子的:

普通队列实现
手写实现:
#include <iostream>
using namespace std;
struct queue//将队列封装在一个结构体中
{
int head=0,tail=0;//head代表头指针,tail代表尾指针
int a[100];//队列元素存储于此
void pop(){head++;}//弹出队头元素
void push(int num){a[tail]=num;tail++;}//在队尾插入元素
int size(){return tail-head;}//判断队列元素个数
int back(){return a[tail-1];}//返回队尾元素
int front(){return a[head];}//返回队头元素
bool empty(){if(head==tail)return true;return false;}//判断队列是否为空
};
int main()
{
//测试手写队列
queue q;
q.push(1);
cout<<q.front()<<endl;
q.pop();
if(q.empty())q.push(2);
cout<<q.front()<<endl;
q.push(3);
cout<<q.back()<<endl;
cout<<q.size();
return 0;
}
STL实现:
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int main()
{
queue<int>q;
q.pop();//弹出队头元素
q.push(1);//将1这个元素插入队尾
q.size();//判断队列元素个数
q.front();//返回队头元素
q.back();//返回队尾元素
q.empty();//判断队列是否为空
return 0;
}
单调队列
顾名思义,单调队列可以保证队内元素时刻保持单调(单调递增、单调递减、单调非减、单调非增)。
单调队列虽然叫“队列”,但其实和队列有很大差别:为了保证队内元素单调,会强行舍弃队中的一些元素。这点与FIFO的队列有很大不同,所以应该把单调队列看作是原数列的一个单调子序列。
另外,与普通队列不同的是,单调队列可以在队头和队尾插入和删除元素。
优先队列
顾名思义,优先队列就是指队列中的每一个元素都有一个优先级,优先级可以是最大的元素优先级最大,也可以是最小的元素优先级最大,具体看优先队列的定义。
优先队列,其实在本质上与堆没有多大的区别。
优先队列实现
手写实现:
#include <iostream>
#define cmp(a,b) (a>b)//如果要修改元素优先级,在这里修改
#define sort(h,t) for(int i=t-1;cmp(a[i],a[i-1])&&i>=h;i--)swap(a[i],a[i-1])
using namespace std;
struct priority_queue//默认最大的元素优先级最大的优先队列
{
int head=0,tail=0;//head代表头指针,tail代表尾指针
int a[100];//队列元素存储于此
void pop(){head++;}//弹出队头元素
void push(int num){a[tail]=num;tail++;sort(head,tail);}//在队尾插入元素,改变元素优先级
int size(){return tail-head;}//判断队列元素个数
int top(){return a[head];}//返回队头(优先级最高)的元素
bool empty(){if(head==tail)return true;return false;}//判断队列是否为空
};
int main()
{
//测试
priority_queue q;
q.push(1);q.push(2);q.push(3);
cout<<q.size()<<endl;
cout<<q.top()<<endl;
q.pop();
cout<<q.top()<<endl;
q.pop();
cout<<q.top()<<endl;
q.pop();
if(q.empty())q.push(1);
cout<<q.top();
return 0;
}
STL实现:
#include <iostream>
#include <queue>
using namespace std;
int main()
{
priority_queue<int>q;
q.pop();//弹出队头元素
q.push(1);//将1这个元素插入队尾
q.size();//判断队列元素个数
q.top();//返回队头(优先级最高)的元素
q.empty();//判断队列是否为空
return 0;
}
栈部分
栈,是一种数据结构,它具有先进后出(FILO)的特性,意思是,第一个进入的元素,是最后出来的,这与队列完全是相反的。
举个形象的例子:从羽毛球筒里拿羽毛球。
有一个羽毛球筒,只有一个开口,里面放满了羽毛球,这时,你想拿最底下的羽毛球,你会怎么做呢?
答案是:把前面所有的羽毛球都拿出来,最后拿最底下的。
这就运用了栈的思想,栈最主要的特点就是先进后出(FILO)。
栈大概长这样:

栈实现
手写实现:
#include <iostream>
using namespace std;
struct stack//将栈封装在一个结构体当中
{
int a[100];//栈元素存在此中
int Top=0;//栈顶
void pop(){Top--;};//弹出栈顶元素
void push(int num){a[Top]=num;Top++;}//将元素插入栈顶
int top(){return a[Top];}//返回栈顶元素
int size(){return Top;}//判断栈元素个数
bool empty(){if(!Top)return true;return false;}//判断栈是否为空
};
int main()
{
//测试
stack s;
s.push(1);
cout<<s.top()<<endl<<s.size()<<endl;
s.pop();
if(s.empty())s.push(2);
cout<<s.top();
return 0;
}
STL实现:
#include <iostream>
#include <stack>
using namespace std;
int main()
{
stack<int>s;
s.pop();//弹出栈顶元素
s.push(1);//将1这个元素插入栈顶
s.top();//返回栈顶元素
s.size();//判断栈元素个数
s.empty();//判断栈是否为空
return 0;
}
栈&队列的更多相关文章
- java 集合 Connection 栈 队列 及一些常用
集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...
- Java 容器之 Connection栈队列及一些常用
集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...
- java面向对象的栈 队列 优先级队列的比较
栈 队列 有序队列数据结构的生命周期比那些数据库类型的结构(比如链表,树)要短得多.在程序操作执行期间他们才被创建,通常用他们去执行某项特殊的任务:当完成任务之后,他们就会被销毁.这三个数据结构还有一 ...
- C++实现一个简单的双栈队列
双栈队列的原理是用两个栈结构模拟一个队列, 一个栈A模拟队尾, 入队的元素全部压入此栈, 另一个栈B模拟队首, 出队时将栈A的元素弹入栈B, 将栈B的栈顶元素弹出 此结构类似汉诺塔, 非常经典, 这里 ...
- 栈&队列&并查集&哈希表(julyedu网课整理)
date: 2018-11-25 08:31:30 updated: 2018-11-25 08:31:30 栈&队列&并查集&哈希表(julyedu网课整理) 栈和队列 1. ...
- Leetcode栈&队列
Leetcode栈&队列 232.用栈实现队列 题干: 思路: 栈是FILO,队列是FIFO,所以如果要用栈实现队列,目的就是要栈实现一个FIFO的特性. 具体实现方法可以理解为,准备两个栈, ...
- 【图解数据结构】 栈&队列
[TOC] 勤于总结,持续输出! 1.栈 1.1栈的定义 栈(stack)是限定在表尾进行插入和删除的操作的线性表. 我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不包 ...
- 数据结构 栈&队列
2-4 依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是( ) 删除,移动头指针: 增加,移动尾指针: 删除a,b ,队头c 2-3 在一个链队列中,fron ...
- day22 栈 , 队列 , 约束和反射
#!/usr/bin/env python# -*- coding:utf-8 -*- # 1.请使用面向对象实现栈(后进先出)"""class Account: def ...
随机推荐
- nginx配置proxy_pass URL末尾加与不加/(斜线)的区别
nginx在配置proxy_pass的时候 URL结尾加斜线(/)与不加的区别和注意事项 假设访问路径的 /pss/bill.html 加/斜线的情况 location /pss/ { proxy_p ...
- CGI 、FastCGI、PHP-CGI、PHP-FPM 定义以及与nginx的应用关系
CGI common gateway interface,简称cgi,简而言之就是一个接口,一种协议.它的作用就是帮助服务器与语言通信. 这里以nginx和php为例,因为nginx和php的语言不通 ...
- 如何解决分配到Autoconfiguration IPV4 地址
配置完服务器静态IP后,在CMD窗口中查看ip地址,发现是Autoconfiguration IPV4. 上网搜索了,是关于虚拟服务器的,但是我没有配置虚拟服务器,有点奇怪. 使用下面的教程,可以解决 ...
- windows 为qt5.7.1 安装openssl
本人使用qt5.7.1+msvc2015写一个https的客户端程序,但是用到解析https协议时,报出如下错误 qt.network.ssl: QSslSocket: cannot call unr ...
- LeetCode算法题-Search in a Binary Search Tree(Java实现)
这是悦乐书的第295次更新,第314篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第163题(顺位题号是700).给定一个二叉搜索树(BST)的和正整数val. 你需要在 ...
- SAP CRM Installed Bases(IBase)简介
SAP CRM使用Installed Base(以下简称IBase)来组织服务相关对象并进行管理.因为我在最近的工作中经常接触这个概念,所以学习了一点相关文档.下面是文档的翻译. 本文链接:https ...
- 2017 百度杯丶二月场第一周WP
1.祸起北荒 题目: 亿万年前 天子之子华夜,被父神之神末渊上神告知六荒十海之北荒西二旗即将发生一场"百度杯"的诸神之战 他作为天族的太子必须参与到此次诸神之战定六荒十海 华夜临危 ...
- 多线程中的event,用于多线程的协调
''' 简单的需求:红绿灯,红灯停,绿灯行 一个线程扮演红绿灯,每过一段时间灯变化,3-5个线程扮演车,红灯停,绿灯行 红绿灯线程和车的线程会相互依赖 这种场景怎么实现?---事件 切换一次灯就是一次 ...
- Enterprise architect 类图加时序图
原文地址:https://segmentfault.com/a/1190000005639047#articleHeader2 新建一个Project 没什么好说的,“文件-新建项目”,然后选择保存位 ...
- 《JAVA程序设计》_第三周学习总结
20175217吴一凡 一.IDEA学生免费版申请后续 收到这个邮件,就说明你申请成功了,点这里进去就行了 点击接受 在下一个界面登录你之前注册的账号绑定许可证就行了,重新登录你的账号就有了一年的许可 ...