【C++】两个队列实现一个栈

原创 2015年11月19日 20:49:26
两个队列实现一个栈的思想:用_PushQ1队列作为push数据的队列,用_TmpQ2队列暂存数据

1.只要是对栈进行push操作,就将数据push入_PushQ1队列中。
2.要实现栈的pop操作,就要在_PushQ1队列或_TmpQ2队列不为空的情况下:
(1)若_PushQ1队列为空,而_TmpQ2队列不为空时,则swap(_TmpQ2, _PushQ1),便得_PushQ1队列不为空,_TmpQ2队列为空。否则直接转(2)

 (2)把_PushQ1队列中的数据按照队列的pop规则,都转移到_TmpQ2队列中,直到_PushQ1中的数据只有一个时结束转移。

 (3)执行完步骤(2)后,对_PushQ1队列中仅剩的那一个数据执行pop操作,就是所要实现的栈的pop操作。
#include<iostream>
#include<queue>
using namespace std;
class Stack
{
public:
           void Push(const int & x)
          {
                   _PushQ1 .push( x);
          }
           void Pop()
          {
                    if (!Empty())
                   {
                              if (_PushQ1 .empty() && !_TmpQ2 .empty())
                             {
                                      swap(_PushQ1 , _TmpQ2 );
                             }
                             
                              int size = _PushQ1 .size();
                              while (--size)
                             {
                                      _TmpQ2 .push(_PushQ1 .front());
                                      _PushQ1 .pop();
                             }
                             _PushQ1 .pop();
                             
                   }
          }
           const int & Top()
          {
                    if (!Empty())
                   {
                              if (_PushQ1 .empty() && !_TmpQ2 .empty())
                             {
                                      swap(_PushQ1 , _TmpQ2 );
                             }
                              int size = _PushQ1 .size();
                              while (--size)
                             {
                                      _TmpQ2 .push(_PushQ1 .front());
                                      _PushQ1 .pop();
                             }
                              return _PushQ1 .front();
                   }
          }

           bool Empty()
          {
                    return _PushQ1 .empty() && _TmpQ2 .empty();
          }
private:
           queue<int >_PushQ1 ;
           queue<int >_TmpQ2 ;
};
<pre name="code" class="cpp">void Test()
{
	Stack s;
	s.Push(1);
	s.Push(2);
	s.Push(3);
	s.Push(4);
	s.Push(5);
	s.Push(6);
	s.Pop();
	s.Pop();
	s.Pop();
	s.Push(100);
	s.Pop();
	s.Pop();
	s.Pop();
}
int main()
{
	Test();
	system("pause");
	return 0;
}



相关文章推荐

使用两个队列实现一个栈

队列是先进先出,而栈是先进后出;考虑到我们取栈顶元素的便利性,我们在实现时使得栈顶等于队列头;由于栈的pop弹出栈顶元素,而队列的pop也是弹出栈顶元素,所以我们需要特别处理的是插入操作。由于往栈中添...

C++算法之 两个队列实现一个栈

题目:用两个队列实现一个栈 算法思路: 现有两个队列q1与q2,入栈:如果q1与q2都为空,那么我们选择q1入栈也就是入队列,比如q1入栈 1 2 3 4 ;现在要出栈,后进先出那么4要出栈。但是...

【C++面试题】利用两个栈实现1个队列

1、题目   利用两个栈实现一个队列    2、要求   只能使用栈的pop(),top()和push(),以及测试栈是否为空empty()四个操作. 来实现队列的empty(), ...

《剑指offer》:[7]两个队列实现栈的C++代码实现

问题:两个队列实现栈。     因为队列的特点是先进先出,而栈式先进后出。所以具体的实现步骤如下: (1)判断是否为NULL;如果queue1和queue2都为NULL,则该栈为NULL; (2)如果...
  • gogoky
  • gogoky
  • 2016年05月26日 11:21
  • 523

C++算法之 用两个栈实现一个队列

算法思路: 一个栈用来入队列,一个栈用来出队列: 现有两个栈s1 和s2;s1用来入栈,比如  队列进入  1 2 3 4 5 那么s1进栈 1 2 3 4 5 ,现在要出队列,意思就是要1先出来; ...

C/C++之用两个栈实现一个队列的功能

问题:有两个栈s1和s2,实现队列的push和pop功能。 思路:始终维护

【C++】两个栈实现一个队列

//两个栈实现一个队列的思想: //1.只要实现的是队列的push功能,就把数据push进_PushStack栈。 //2.要实现队列的pop功能时,分两种情况: // (1):当_PopStack...
  • ZDF0414
  • ZDF0414
  • 2015年11月19日 20:51
  • 259

利用两个队列实现一个栈(C++版)

题目: 利用两个队列实现一个栈的功能,完成pop() push() top() empty()等功能。 push(x) -- Push element x into stack.pop()...

《剑指offer》:[6]两个栈实现一个队列的C++代码实现

问题:用两个栈实现一个队列,完成在队列尾部插入节点和在队列头部删除结点的功能。 由于栈的特点是先进后出,要想实现队列,必须做到先进先出;      首先将数据输入到stack1中,这时候先进后出,再将...
  • gogoky
  • gogoky
  • 2016年05月26日 11:16
  • 436
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C++】两个队列实现一个栈
举报原因:
原因补充:

(最多只允许输入30个字)