用两个队列模拟实现一个栈的过程

栈具有“后进先出”的特点,即某个元素最后进入栈,却最先出栈;队列具有“先进先出”的特点,即元素从队尾依次进队列,依次从队头出队列;现在用两个队列模拟实现一个栈的过程,详细过程请看下面这张本人制作的gif图:

实现代码:

#include <iostream>

using namespace std;

#include <queue>

template <typename T>

class Stack {

public:

void Push(T elem);//向队列中添加元素

void Pop();//向队列中删除元素

T Top();//返回最后进入的头元素

bool Empty();//判断队列是否为空

int Size() const;//返回队列中元素个数

private:

queue<T> q1;

queue<T> q2;

};

template <typename T>

bool Stack<T>::Empty()  //判断模拟的栈是否为空

{

if (q1.empty() && q2.empty())

{

return true;

}

return false;

}

template <typename T>

int Stack<T>::Size() const //返回模拟栈中元素的个数

{

if (!q1.empty())

{

return q1.size();

}

else

{

return q2.size();

}

}

template <typename T>

T Stack<T>::Top()//返回最后进入的头元素

{

if (Empty())

{

throw;

}

else if (!q1.empty())

{

return q1.back();

}

else

{

return q2.back();

}

}

template <typename T>

void Stack<T>::Push(T elem) //向队列中添加元素

{

if (q1.empty() && q2.empty())

{

q1.push(elem);

}

else if (!q1.empty())

{

q1.push(elem);

}

//q2不为空

else//两个队列不可能同时为空,因为在之前删除元素操作时,有一个必为空队列

{

q2.push(elem);

}

}

template <typename T>

void Stack<T>::Pop() //向队列中删除头元素,先进先出

{

if (Empty())//两个队列都为空,无法删除

{

throw;

}

if (!q1.empty())

{

while (q1.size()>1)

{

q2.push(q1.front());

q1.pop();

}

q1.pop();

}

//q2不为空

else //if (!q2.empty() && q1.empty())

{

while (q2.size()>1)

{

q1.push(q2.front());

q2.pop();

}

q2.pop();

}

}

int main()

{

Stack<int> s;

int i = 0;

for (i = 1; i <= 5; i++)

{

s.Push(i);

}

cout << "出栈的顺序为:" << endl;

while (!s.Empty())

{

cout << s.Top() << endl;

s.Pop();

}

system("pause");

return 0;

}

运行结果:

出栈的顺序为:

5

4

3

2

1

请按任意键继续. . .

时间: 2024-10-20 13:36:33

用两个队列模拟实现一个栈的过程的相关文章

(LeetCode)两个队列来实现一个栈

原题例如以下: Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. pop() -- Removes the element on top of the stack. top() -- Get the top element. empty() -- Return whether the stack is empty. Notes: You must us

剑指offer:两个队列模拟一个栈

题目描述用两个队列来实现一个栈,完成栈的Push和Pop操作. 队列中的元素为int类型. 实现方式其实和两个栈模拟一个队列相似,但是区别在于这两个队列的作用和那两个栈的作用不一样. class Solution: """ 用两个队列模拟一个栈,如果两个队列的容量分别为M和N,其中M > N,那么模拟得到的栈的容量是N+1 因为假设先把queue1塞进N+2个,此时将元素出栈,则需要先将queue1的N+1个元素出队后压入queue2, 由于queue2的容量只有N,入

两个栈模拟一个队列和两个队列模拟一个栈

此为网易的一道笔试题.到时候秀逗,不知所云.后来研究之后记录下,以备以后经常翻阅. 栈:先进后出 push和pop 队列:先进先出 offer和poll (1)两个栈模拟一个队列 即将先进后出实现先进先出.比较容易理解,只要所有数据先往一个栈里push,然后将该栈中的数据依次pop出来再push进第二个队列,则顺序自然颠倒过来了,则每次pop是从第二个队列中取数据. import java.util.*; public class StackQueue{ private Stack<Intege

两个队列模拟一个栈

#include <iostream> #include <assert.h> #include <queue> using namespace std; /*两个队列模拟一个堆栈*/ /*队列A.B 入栈:将元素依次压入到非空的队列,第一个元素压倒对列A 出栈:把队列A的前n-1个元素倒到队列B,把第n个元素去掉.此时数据在B中,下次操作,则对B操作. 栈顶:把队列A的前n-1个元素倒到队列B,把第n个元素作为栈顶*/ template <typename T&

使用两个队列模拟一个栈

准备笔试,在看相关知识,看到这个问题,如何使用两个队列模拟一个栈,在参考了相关知识下,实现了代码如下: 1 public class Stack<E>{ 2 Queue<E> q1 = null; //队列q1提供压栈功能, 3 Queue<E> q2 = null; //队列q2提供弹栈功能 4 5 public Stack(){ 6 q1 = new LinkedList<E>(); 7 q2 = new LinkedList<E>(); 8

数据结构和算法之栈和队列一:两个栈模拟一个队列以及两个队列模拟一个栈

今天我们需要学习的是关于数据结构里面经常看到的两种结构,栈和队列.可以说我们是一直都在使用栈,比如说在前面递归所使用的的系统的栈,以及在链表倒序输出时介绍的自定义栈类Stack和使用系统的栈进行递归.那么,在这里我们就讲述一下这两个比较具有特色的或者说关系比较紧密的数据结构之间的互相实现问题. 一:两个栈模拟实现一个队列: 栈的特点是先进后出,然而队列的特点是先进先出. public class Queen(Stack s1,Stack s2){ //实现插入的方法 public void ad

7 两个栈模拟队列,两个队列模拟栈

利用两个栈模拟队列 stack1,stack2 首先向stack1当中放入数据,如果需要输出数据,从stack2中delete数据,如果stack2为空,就把stack1中数据导入stack2 <span style="font-size:14px;">#include "static.h" #include <iostream> #include <stack> template<typename T> class

栈和队列:用一个栈实现另一个栈的排序

题目: 一个栈中的元素类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只允许申请一个栈.如何完成排序? 将排序的栈记为 stack,辅助栈记为 help,在stack上执行pop操纵,弹出的元素为 tmp 1. 如果 tmp 大于或等于 help 的栈顶元素或 help 为空,则将 tmp 压入 help: 2. 如果 tmp 小于 help 的栈顶则将 help 的元素弹出,逐一压入 stack,直到 tmp 大于或等于 help 的栈顶元素,再将 tmp 压入 help: 一直执行到

leetccode 225. 用队列实现栈(两个队列模拟)

使用队列实现栈的下列操作: push(x) -- 元素 x 入栈pop() -- 移除栈顶元素top() -- 获取栈顶元素empty() -- 返回栈是否为空注意: 你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的.你所使用的语言也许不支持队列. 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可.你可以假设所有操作都是有效的(例如, 对一个