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

Posted FocusA

tags:

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

转载请注明出处

初始时,保证两个栈至少有一个为空;本程序的类中两个栈在初始化时默认为空栈;

队列特性为先进先出,

元素依次入栈s1内后,再将非空栈s1内的元素依次出栈全部压入到空栈s2内,就实现了原s1内后进来的数据放到了s2最下面,

这样栈s2的元素在逐个进行出栈操作时,就实现了模拟队列的的出队操作,出队顺序和s1进栈顺序相同,实现了先进先出,满足了队列性质;

  1 //两个栈模拟一个队列行为
  2 
  3 class SimQueue
  4 {
  5 public:
  6     SimQueue() { count = 0;}
  7     void SimPush(int);//入队:队尾增加元素,
  8     void SimPop(); //出队:删除队首元素
  9     int SimFront();//取队首元素
 10     int SimBack(); //取队尾元素
 11     bool SimEmpty();
 12     int SimSize();
 13 private:
 14     int count; //统计元素数量
 15     stack<int> s1;
 16     stack<int> s2;
 17 };
 18 
 19 inline 
 20 void SimQueue::SimPush(int num)
 21 {
 22     //初始时,将元素压到s1中;
 23     //如果初始时s1不为空,也无妨,但s2一定要为空
 24     //本程序的类中两个栈在初始化时默认为空栈;
 25     s1.push(num);
 26     ++count;
 27 }
 28 
 29 inline
 30     void SimQueue::SimPop()
 31 {
 32     if (s2.empty())
 33     {
 34         while (!s1.empty())
 35         {
 36             s2.push(s1.top());
 37             s1.pop();
 38         }
 39         s2.pop();
 40     }
 41     else
 42         s2.pop(); //多次删除队首元素值进入这个分支;
 43     --count;
 44 }
 45 inline
 46 int SimQueue::SimFront()
 47 {
 48     if (s1.empty()!=true&&s2.empty()==true)
 49     {
 50         while (!s1.empty())
 51         {
 52             s2.push(s1.top());
 53             s1.pop();
 54         }
 55         int tmp = s2.top();
 56         return tmp;
 57     }
 58     else
 59         return s2.top(); //s2不空时取队首元素值
 60     
 61 }
 62 inline
 63 int SimQueue::SimBack()
 64 {
 65     if (s1.empty()==true&&s2.empty()!=true)
 66     {
 67         while (s2.empty()!=true)
 68         {
 69             s1.push(s2.top());
 70             s2.pop();
 71         }
 72         return s1.top();
 73     }else
 74         return s1.top(); //以防s1不空时候取队尾元素值;
 75 }
 76 inline
 77 int SimQueue::SimSize()
 78 {
 79     return count;
 80 }
 81 inline
 82 bool SimQueue::SimEmpty()
 83 {
 84     return (count == 0);
 85 }
 86 
 87 
 88 int main()
 89 {
 90     SimQueue q;
    //入队
91 q.SimPush(1); 92 q.SimPush(2); 93 q.SimPush(3); 94 q.SimPush(4); 95 q.SimPush(5); 96 97 int qsize = q.SimSize(); 98 cout <<"queue size: " << qsize << endl; 99 cout << "多次取队首元素值: "; 100 cout << q.SimFront() <<" "; 101 cout << q.SimFront() <<endl; 102 cout << "多次取队尾元素值: "; 103 cout << q.SimBack()<<" "; 104 cout << q.SimBack()<<endl; 105 106 //队,栈均不提供遍历操作 107 cout << "删除元素1后: "; 108 q.SimPop(); //删除1, 109 cout << "current size: "<< q.SimSize()<<endl; 110 cout << "剩余元素出队: "<<endl; 111 cout << q.SimFront()<<","; 112 q.SimPop(); 113 cout << q.SimFront()<<","; 114 q.SimPop(); 115 cout << q.SimFront() <<","; 116 q.SimPop(); 117 cout << q.SimFront()<<endl; 118 q.SimPop(); 119 }

输出结果:

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

使用两个队列模拟一个栈

两个栈模拟一个队列

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

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

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

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