两个队列实现栈

前面已经实现了两个栈实现队列的功能(http://www.cnblogs.com/ivorfeng/archive/2013/05/01/3053206.html),今天就实现利用两个队列实现栈的push和pop功能。


思路:已有queue1和queue2;

进栈:初始时,两个队列均为空,元素压入queue1;之后需要判断压入非空的队列中;

出栈:出栈时,两个队列必有一个为空,另一个非空,因此需要把非空的队列只留下最后一个元素,其他均转移到另一个队列中;再把之前剩下的一个元素输出。

ps:出栈的时候,一开始想着统一代码,想把已经转移到另一个队列的元素再转回来,这样就可以保持每次只对其中一个队列(queue1)操作pop;后来经小涛同志的提醒,发现两个队列会有一个为空,可以利用这个特点判断对那个队列操作,避免了转移带来的额外复杂度。


实现代码如下

code:

 1 template<typename T>class CStack
 2 {
 3 public:
 4     CStack(void);
 5     ~CStack(void);
 6     void push(T element);
 7     T pop();
 8 private:
 9     queue<T> queue1;
10     queue<T> queue2;
11 };
12 
13 template<typename T> CStack<T>::CStack(void)
14 {
15 };
16 template<typename T> CStack<T>::~CStack(void)
17 {
18 };
19 //压入栈
20 template<typename T>void CStack<T>::push(T element)
21 {
22     if (queue2.empty())
23     {
24         queue1.push(element);
25     }
26     else
27     {
28         queue2.push(element);
29     }
30 
31 };
32 //出栈
33 template<typename T>T CStack<T>::pop()
34 {
35     //queue2空,则操作queue1
36     if (queue2.empty())
37     {
38         if (queue1.empty())
39         {
40             throw new exception("Stack is empty");
41         }
42         //queue1留下一个元素,其他都转移到queue2中
43         while (queue1.size() > 1)
44         {
45             T& tmp1 = queue1.front(); 
46             queue2.push(tmp1);
47             queue1.pop();
48         }
49         T tmp2 = queue1.front();
50         queue1.pop();
51         return tmp2;
52     }
53     else//否则操作queue2
54     {
55         if (queue2.empty())
56         {
57             throw new exception("Stack is empty");
58         }
59         while (queue2.size() > 1)
60         {
61             T& tmp1 = queue2.front(); 
62             queue1.push(tmp1);
63             queue2.pop();
64         }
65         T tmp2 = queue2.front();
66         queue2.pop();
67         return tmp2;
68     }
69 };

测试代码:

 1 //---------------------------TEST--------------------//
 2 void Test(char actual, char expected)
 3 {
 4     if(actual == expected)
 5         printf("Test passed.\n");
 6     else
 7         printf("Test failed.\n");
 8 }
 9 
10 int main()
11 {
12     CStack<char> mystack;
13 
14     mystack.push('a');
15     mystack.push('b');
16     mystack.push('c');
17 
18     char head = mystack.pop();
19     Test(head, 'c');
20 
21     head = mystack.pop();
22     Test(head, 'b');
23 
24     mystack.push('d');
25     head = mystack.pop();
26     Test(head, 'd');
27 
28     mystack.push('e');
29     head = mystack.pop();
30     Test(head, 'e');
31 
32     head = mystack.pop();
33     Test(head, 'a');
34 
35     return 0;
36 }
原文地址:https://www.cnblogs.com/ivorfeng/p/3057808.html