使用双栈实现一个队列

在往上看到这样的题目:

 

大体的有如下几个思路:

  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 }

 

posted @ 2015-10-22 14:54  eversliver  阅读(686)  评论(0编辑  收藏  举报