用两个栈实现一个队列(C++)
分析
- 栈:后进先出
- 队列:先进先出
要使用两个栈实现队列(先进先出),主要思路是
1.插入一个元素:直接将元素插入stack1即可。
2.删除一个元素:当stack2不为空时 ,直接弹出栈顶元素,当stack2为空时,将stack1元素逐个弹出并压入stack2,然后再弹出栈顶元素。
具体看下面的代码。
代码实现
#include <iostream>
#include <stack>
using namespace std;
template<class T>
class Queue
{
private:
stack<T> s1;
stack<T> s2;
public:
//入队
void Push(const T &val);
//出队
void Pop();
//返回队首元素
T& Front();
//返回对尾元素
T& Back();
//判断队列是否为空
bool Empty();
//返回队列大小
T Size();
};
//归纳:
//1.插入一个元素:直接将元素插入stack1即可;
//2.删除一个元素:当stack2不为空时 ,直接弹出栈顶元素,当stack2为空时,将stack1元素逐个弹出并压入stack2,然后在弹出栈顶元素;
//入队
template<class T>
void Queue<T>::Push(const T &val)
{
//栈s1做队列的队尾,s2做队列的对头
s1.push(val);
}
//出队
template<class T>
void Queue<T>::Pop()
{
if (!s2.empty())
{
s2.pop();
}
//s2为空时,s1中的所有内容逐一出栈压入s2
else
{
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
//压入之后,s2的存放顺序正好和s1的相反,符合队列的先进先出,直接s2出栈
if (s2.empty())
{
cout << "队列为空" << endl;
exit(1);
}
s2.pop();
}
}
//返回队首元素
template<class T>
T& Queue<T>::Front()
{
if (!s2.empty())
{
return s2.top();
}
//s2为空时,s1中的所有内容逐一出栈压入s2
else
{
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
//压入之后,s2的存放顺序正好和s1的相反,符合队列的先进先出
if (s2.empty())
{
cout << "队列为空" << endl;
exit(1);
}
return s2.top();
}
}
//返回对尾元素
template<class T>
T& Queue<T>::Back()
{
//s1不为空直接取
if (!s1.empty())
{
return s1.top();
}
//s2不为空,把s2中的内容放回s1,然后返回
while (!s2.empty())
{
s1.push(s2.top());
s2.pop();
}
if (!s1.empty())
{
return s1.top();
}
else
{
cout << "队列为空" << endl;
exit(1);
}
}
//判断是否为空
template<class T>
bool Queue<T>::Empty()
{
if (s1.empty() && s2.empty())
{
return true;
}
else
{
return false;
}
}
//返回对列尺寸
template<class T>
T Queue<T>::Size()
{
return s1.size() + s2.size();
}
int main()
{
Queue<int> q;
q.Push(1);
q.Push(2);
q.Push(3);
q.Push(4);
q.Push(5);
q.Push(6);
cout << "队列空否: " << q.Empty() << endl;
cout << "获取队头元素:" << q.Front() << endl;
cout << "获取队尾元素: " << q.Back() << endl;
cout << "获取队列的大小:" << q.Size() << endl;
cout << "出队" << endl;
q.Pop();
cout << "获取队列的大小:" << q.Size() << endl;
cout << "入队" << endl;
q.Push(7);
cout << "队列空否: " << q.Empty() << endl;
cout << "获取队头元素:" << q.Front() << endl;
cout << "获取队尾元素: " << q.Back() << endl;
cout << "获取队列的大小:" << q.Size() << endl;
cout << "出队" << endl;
q.Pop();
cout << "获取队列的大小:" << q.Size() << endl;
cout << "出队" << endl;
q.Pop();
cout << "获取队列的大小:" << q.Size() << endl;
system("pause");
return 0;
}
运行测试

用两个栈实现一个队列(C++)的更多相关文章
- Python两个栈实现一个队列
牛客网原题: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 实现这个算法的方式有很多种,这里就写一种比较简单易懂的:虽然可能算法和效率上不太出色,当大多数人 ...
- web前端面试系列 - 数据结构(两个栈模拟一个队列)
一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将 ...
- java两个栈实现一个队列&&两个队列实现一个栈
栈:先进后出 队列:先进先出 两个栈实现一个队列: 思路:先将数据存到第一个栈里,再将第一个栈里的元素全部出栈到第二个栈,第二个栈出栈,即可达到先进先出 源码: class Queue<E&g ...
- python两个队列实现一个栈和两个栈实现一个队列
1.两个栈实现一个队列 两个栈stack1和stack2, push的时候直接push进stack1,pop时需要判断stack1和stack2中的情况.如果stack2不为空的话,直接从stack2 ...
- 两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素。
一.思路:1.创建两个空栈A和B:2.A栈作为队列的入口,B栈作为队列的出口:3.入队列操作:即是入栈A:4.出队列操作:若栈B为空,则将A栈内容出栈并压人B栈,再出 B栈:不为空就直接出栈: 二.代 ...
- 剑指offer(五):用两个栈实现一个队列
题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解决办法: 队列先进先出,栈先进后出(stack1和stack2) 其实主要要注意的点是: ①在添加时直接 ...
- 剑指offer:用两个栈实现一个队列
题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路 用一个栈A来保存入栈,当要出栈的时候,将栈A的元素按照栈后进先出的特点转移到栈B中(此时栈A为空了 ...
- (LeetCode)用两个栈实现一个队列
LeetCode上面的一道题目.原文例如以下: Implement the following operations of a queue using stacks. push(x) -- Push ...
- 【校招面试 之 剑指offer】第9-1题 用两个栈实现一个队列
#include<iostream> #include<stack> using namespace std; template <typename T> void ...
随机推荐
- Windows下将Python源代码.py文件封装成exe可执行文件方法
安装pyinstaller cmd中使用pip安装 pip install pyinstaller 同时会自动安装pywin32(pip真慢50M这里就走20KB),可以进行切换为国内源进行提速. 就 ...
- php速成_day3
一.MySQL关系型数据库 1.什么是数据库 数据库 数据存储的仓库,在网站开发应用当中,需要有一些数据存储起来. 注册的用户信息,使用PHP变量只是一个临时的存储,如果需要永久的存储起来,就把数据存 ...
- Django框架(九):视图(二) HttpRequest对象、HttpResponse对象
1. HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象,这个对象不需要我们创建,直接使用服务器构造好的对象就可以.视图的第一个参数必须是HttpR ...
- Spring Cloud Alibaba 教程 | Nacos(一)
什么是Nacos Nacos是一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台. Nacos 致力于帮助您发现.配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助您快速实现动态 ...
- Object中有哪些公共方法及作用
大家在学习java的时候,一定遇到过Object类,因为在java单一继承体系中Object类是根类,所有的类都会继承它,并拥有Object的公共方法,意味着在java的面向对象的世界中,所有对象都拥 ...
- ZJNU 2135 - 小智的宝可梦
因为成环 所以可以枚举第1只与第n只喂的次数 然后第1只和第2只的次数就固定了,以此类推,则所有宝可梦喂的次数都固定了 最后处理完检查是否全为0,不是则进行下一次枚举,是则直接输出Yes 如果所有枚举 ...
- Vue专题-生命周期
有时候,我们需要在实例创建过程中进行一些初始化的工作,以帮助我们完成项目中更复杂更丰富的需求开发,针对这样的需求,Vue提供给我们一系列的钩子函数. 本文详细介绍了Vue实例在创建和销毁的过程中,我们 ...
- 如何把Visual Studio完全安装在其他磁盘
//Visual Studio快把我c盘吃完了,就网上找了找解决方法,自己总结一下,方便理解 第一步 找到以下文件夹 C:\\Program Files (x86)\\Microsoft SDKs C ...
- java合并一个文件夹下所有txt文件,输出到另一个txt
最近写了个单元测试,递归调用方法,把同一个文件夹里所有的txt合并输出到一个txt文件.参考了两个博客,分别是已有的方法,还有个就是检测txt文件所用编码的技术贴.如果不检测txt文件的编码,那么转换 ...
- CodeForces 995B Suit and Tie(贪心,暴力)
https://codeforces.com/problemset/problem/995/B 题意: 就是通过每次移动相邻的两位数,来使数值相同的数挨在一起,求最少要移动多少次. 思路: 直接从前往 ...