码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-05-28 23:25:34      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:private   include   public   return   false   


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

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

标签:private   include   public   return   false   

原文地址:http://yaoyaolx.blog.51cto.com/10732111/1784121

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!