使用双栈实现一个队列
在往上看到这样的题目:
大体的有如下几个思路:
1 一个栈维护队列的内容,当入队列的操作的时候就直接入s1栈,当出队列的时候就现将s1栈底以外的内容都push到s2中保存起来,将s1栈底返回后将s2内容在弹回来。
2 s1作为压栈之用,s2作为出栈之用。入队列的时候就直接检查s1中有无对象,没有检查s2,如果s2中有对象就将s2中值全部弹回s1,再将新的对象入栈。
3 最后一种与上面相同,不过栈的作用发生了改变。
这里就简单列出第二种的实现: (同理的,双队列实现栈也可以类似的实现,且方法也是类似的)
1 class Stack{ 2 //... 3 void push(int ); 4 int pop(); 5 int count(); 6 //... 7 }; 8 9 class Queue{ 10 public: 11 void enqueue(int ); 12 int dequeue(); 13 int count() const; 14 private: 15 Stack s1; 16 Stack s2; 17 }; 18 19 //1为入栈用,2作为出栈用 20 void Queue::enqueue(int obj) 21 { 22 if(s1.count() == 0 && s2.count() != 0){ 23 while(s2.count() != 0){ 24 s1.push(s2.pop()); 25 } 26 s1.push(obj); 27 }else{ 28 s1.push(obj); 29 } 30 } 31 32 int Queue::dequeue() 33 { 34 if(s2.count() == 0 && s1.count() != 0){ 35 while(s1.count() != 0){ 36 s2.push(s1.pop()); 37 } 38 return s2.pop(); 39 }else{ 40 if(s2.count() != 0) 41 return s2.pop(); 42 } 43 }