分析

  • 栈:后进先出
  • 队列:先进先出

要使用两个栈实现队列(先进先出),主要思路是

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++)的更多相关文章

  1. Python两个栈实现一个队列

    牛客网原题: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.   实现这个算法的方式有很多种,这里就写一种比较简单易懂的:虽然可能算法和效率上不太出色,当大多数人 ...

  2. web前端面试系列 - 数据结构(两个栈模拟一个队列)

    一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将 ...

  3. java两个栈实现一个队列&&两个队列实现一个栈

    栈:先进后出  队列:先进先出 两个栈实现一个队列: 思路:先将数据存到第一个栈里,再将第一个栈里的元素全部出栈到第二个栈,第二个栈出栈,即可达到先进先出 源码: class Queue<E&g ...

  4. python两个队列实现一个栈和两个栈实现一个队列

    1.两个栈实现一个队列 两个栈stack1和stack2, push的时候直接push进stack1,pop时需要判断stack1和stack2中的情况.如果stack2不为空的话,直接从stack2 ...

  5. 两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素。

    一.思路:1.创建两个空栈A和B:2.A栈作为队列的入口,B栈作为队列的出口:3.入队列操作:即是入栈A:4.出队列操作:若栈B为空,则将A栈内容出栈并压人B栈,再出 B栈:不为空就直接出栈: 二.代 ...

  6. 剑指offer(五):用两个栈实现一个队列

    题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解决办法: 队列先进先出,栈先进后出(stack1和stack2) 其实主要要注意的点是: ①在添加时直接 ...

  7. 剑指offer:用两个栈实现一个队列

    题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路 用一个栈A来保存入栈,当要出栈的时候,将栈A的元素按照栈后进先出的特点转移到栈B中(此时栈A为空了 ...

  8. (LeetCode)用两个栈实现一个队列

    LeetCode上面的一道题目.原文例如以下: Implement the following operations of a queue using stacks. push(x) -- Push ...

  9. 【校招面试 之 剑指offer】第9-1题 用两个栈实现一个队列

    #include<iostream> #include<stack> using namespace std; template <typename T> void ...

随机推荐

  1. CMake命令之install

    CMAKE_INSTALL_PREFIX Install directory used by install(). if make install is invoked or INSTALL is b ...

  2. idHttpServer接收类型

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  3. 同时运行两个版本相同的tomcat

    由于项目需要,代理集群和一个节点都部署在本地,那么就需要有两个tomcat,一个部署集群,一个部署项目,我都用了7.0.34版本的tomcat 当启动代理的tomcat成功时,再启动节点的tomcat ...

  4. 黑马_13 Spring Boot:05.spring boot 整合其他技术

    13 Spring Boot: 01.spring boot 介绍&&02.spring boot 入门 04.spring boot 配置文件 05.spring boot 整合其他 ...

  5. nm命令介绍

    一.参考文章 网址1:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/nm.html 参考2: man nm 参考3:<linux ...

  6. R 画地图

    R 绘制中国省市分布地图 library(maps) library(mapdata) library(maptools); getColor=function(mapdata,provname,pr ...

  7. Codeforces Round #603 (Div. 2)E

    http://codeforces.com/contest/1263/problem/E 题意:求合法的括号序列 #include<bits/stdc++.h> using namespa ...

  8. G. Minimum Possible LCM

    https://codeforces.com/contest/1154/problem/G #include<bits/stdc++.h> using namespace std; typ ...

  9. 【shell基础】

    Ctrl+R 搜索之前的命令 Ctrl+D 退出 Ctrl+A 移动到行首 Ctrl+E 移动到行尾 Ctrl+U 删除光标前的内容 Ctrl+K 删除光标后的内容 Ctrl+S 锁频 Ctrl+Q ...

  10. redis数据库写入数据时提示redis.exceptions.ResponseError错误

    今天运行Django项目在redis数据库写入数据时提示如下错误: ERROR log 228 Internal Server Error: /image_code/cf9ccd75-d274-45c ...