两个队列模拟一个栈行为;

Posted strivingforever

tags:

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

两个队列q1,q2,队列构造函数默认构造两个空队列。

将元素入队到q1中,经过一系列入队操作,q1非空,含有n个元素,q2为空队;

将q1中元素依次出队并入队q2,直至只剩下一个元素, 即q1出队n-1个元素,并依次入队到q2中。

此时,q1中仅剩的唯一一个元素,是期初队列最后入队的元素,将该元素删除(pop),就模拟完成了栈的栈顶元素出栈;在删除之前取出该元素,就模拟完成了取栈顶元素 ,这和栈的后进先出一致

此时,q1,为空,q2非空,接下来要做的就是循环的对非空队列入队,取最后一个元素

 

  1 //两个队列模拟栈
  2 
  3 class SimulateStack
  4 {
  5 public:
  6     SimulateStack(){ count = 0;}
  7     ~SimulateStack(){ }
  8     void simPush(int); //模拟入栈
  9     void simPop(); //模拟出栈
 10     int simTop();//取栈顶元素
 11     int simSize();//计算栈元素个数;
 12     bool simEmpty();
 13 private:
 14     queue<int> q1;
 15     queue<int> q2;
 16     int count;
 17 };
 18 
 19 inline
 20 void SimulateStack::simPush(int num)
 21 {
 22     if (!q1.empty())
 23     {
 24         q1.push(num);
 25     }
 26     else
 27         q2.push(num);
 28     count++;
 29 }
 30 
 31 inline
 32 void SimulateStack::simPop()
 33 {
 34     //int tmp;
 35     if (!q1.empty())
 36     {
 37         while (q1.size()!=1)
 38         {
 39             q2.push(q1.front());
 40             q1.pop();
 41         }
 42         //tmp = q1.front();
 43         q1.pop();
 44     }
 45     else
 46         if (!q2.empty())
 47         {
 48             while (q2.size()!=1)
 49             {
 50                 q1.push(q2.front());
 51                 q2.pop();
 52             }
 53             //tmp = q2.front();
 54             q2.pop();
 55         }
 56     --count;
 57 }
 58 
 59 inline
 60 int SimulateStack::simTop()
 61 {
 62     int tmp;
 63     if (!q1.empty())
 64     {
 65         while (q1.size()!=1)
 66         {
 67             q2.push(q1.front());
 68             q1.pop();
 69         }
 70         tmp = q1.front();
 71         q1.pop();
 72     }
 73     else
 74         if (!q2.empty())
 75         {
 76             while (q2.size()!=1)
 77             {
 78                 q1.push(q2.front());
 79                 q2.pop();
 80             }
 81             tmp = q2.front();
 82             q2.pop();
 83         }
 84         //--count;
 85         return tmp;
 86 }
 87 inline
 88 int SimulateStack::simSize()
 89 {
 90     return count;
 91 }
 92 inline
 93 bool SimulateStack::simEmpty()
 94 {
 95     return (count == 0);
 96 }
 97 
 98 int main()
 99 {
100     SimulateStack st;
101     st.simPush(1);
102     st.simPush(2);
103     st.simPush(3);
104     st.simPush(4);
105     st.simPush(5);
106     
107     int st_size = st.simSize();
108     cout << "stack size: "<<st_size<<endl;
109 
110     for (int i = 0; i < st_size; ++i)
111     {
112         cout << st.simTop() << " ";
113     }
114 }

 

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

使用两个队列模拟一个栈

两个栈模拟一个队列

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

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

数据结构和算法之栈和队列一:两个栈模拟一个队列以及两个队列模拟一个栈

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