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

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

在大通等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站制作、成都网站设计 网站设计制作定制网站建设,公司网站建设,企业网站建设,高端网站设计,全网营销推广,成都外贸网站建设,大通网站建设费用合理。

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

实现代码:

#include

using namespace std;

#include

template

class Stack {

public:

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

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

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

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

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

private:

queue q1;

queue q2;

};

template

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

{

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

{

return true;

}

return false;

}

template

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

{

if (!q1.empty())

{

return q1.size();

}

else

{

return q2.size();

}

}

template

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

{

if (Empty())

{

throw;

}

else if (!q1.empty())

{

return q1.back();

}

else

{

return q2.back();

}

}

template

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

{

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

{

q1.push(elem);

}

else if (!q1.empty())

{

q1.push(elem);

}

//q2不为空

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

{

q2.push(elem);

}

}

template

void Stack::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 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://azwzsj.com/article/piesss.html