分析

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

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

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. 2019牛客暑期多校训练营(第七场)A.String【最小表示法】

    传送门:https://ac.nowcoder.com/acm/contest/887/A 题意:大意就是给你一个只含有0和1的字符串,找出一种分割方法,使得每个分割出的字符串都是在该字符串自循环节中 ...

  2. Python笔记_第四篇_高阶编程_进程、线程、协程_2.线程

    1. 线程概述: 在一个进程的内部,要同时干多件事情,就需要同时运行“多个子任务”,我们把进程内的这些“子任务”叫做线程.也就说线程是进程成的子任务. 线程通常叫做情景的进程.线程是通过向内侧控件的并 ...

  3. 1 PHP 5.3中的新特性

    1 PHP 5.3中的新特性 1.1 支持命名空间 (Namespace) 毫无疑问,命名空间是PHP5.3所带来的最重要的新特性. 在PHP5.3中,则只需要指定不同的命名空间即可,命名空间的分隔符 ...

  4. 吴裕雄--天生自然Linux操作系统:Linux 系统启动过程

    linux启动时我们会看到许多启动信息. Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行 init. 系统初始化. 建立终端 . 用户登录系统. in ...

  5. Java基础三(2020.1.15)

    学习内容: 1.Java流程控制之循环结构 2.Java数组 3.Java方法 1.随机数:math.random()得到0-1之间的数     math.random()*10+1得到1-10之间的 ...

  6. Data总结

    getTime() 方法可返回距 1970 年 1 月 1 日之间的毫秒数 var d = new Date(); var n = d.getTime(); //一长串数字

  7. 针对Oracle的一系列操作

    一.有关于数据库导出dmp的语句. 1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中exp system/manager@TEST file=d ...

  8. 输入一段汉字可以获得首字母简拼的java代码

    package com.zl; import java.io.UnsupportedEncodingException; public class Test12 { public static voi ...

  9. Matlab高级教程_第一篇:Matlab基础知识提炼_05

    第九节:矩阵的操作 第十节:数组与矩阵 linspace函数

  10. 在python实现加密的方式总结

    基础知识扫盲 对称加密 对称密钥加密 , 又叫私钥加密.即信息发送的方和接受方用一个密钥去加密和揭秘数据. 最大的优势是 加解密速度快,适合对大量数据进行加密, 对称加密的缺点是密钥的管理和分配, 换 ...