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

发布时间:2020-05-25 13:51:54 作者:岩枭
来源:网络 阅读:1879


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

请按任意键继续. . .


推荐阅读:
  1. 剑指offer:两个队列模拟一个栈
  2. 用两个队列实现一个栈

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

include private public

上一篇:关键帧动画的三种类型

下一篇:Python中list,tuple,dict和set的主要区别

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》