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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用两个队列模拟实现一个栈的过程相关的知识,希望对你有一定的参考价值。


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

请按任意键继续. . .


本文出自 “岩枭” 博客,请务必保留此出处http://yaoyaolx.blog.51cto.com/10732111/1784121

以上是关于用两个队列模拟实现一个栈的过程的主要内容,如果未能解决你的问题,请参考以下文章

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

自定义栈的实现及使用两个栈模拟队列

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

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

队列练习之Example001-用两个栈 s1 和 s2 来模拟一个队列,实现队列的出队入队队是否为空的运算

225. 用队列实现栈简单队列模拟