《剑指offer》面试题7—用两个栈实现队列

题目:给出队列声明,要求实现AppendTail和DeleteHead函数。

template <typename T>
class CQueue
{
public:
void AppendTail(const T& element);
T DeleteHead();
private:
stack<T> stack1;
stack<T> stack2;
};

思路:要用两个先进后出的栈实现先进先出的队列。压栈总是压入stack1,要获得队列头时:如果stack2为空,则把stack1依次弹出栈并压入stack2,取stack2栈顶元素;如果stack2不为空,则直接取stack2栈顶元素。

 1 #include <iostream>
 2 #include <stack>
 3 using namespace std;
 4 
 5 template <typename T>
 6 class CQueue
 7 {
 8 public:
 9     void AppendTail(const T& element);
10     T DeleteHead();
11 private:
12     stack<T> stack1;
13     stack<T> stack2;
14 };
15 
16 template<typename T> void CQueue<T>::AppendTail(const T& element)
17 {
18     stack1.push(element);
19 }
20 
21 template<typename T> T CQueue<T>::DeleteHead()
22 {
23     T temp;
24     if(!stack2.empty())
25     {
26         temp = stack2.top();
27         stack2.pop();
28     }
29     else
30     {
31         if(stack1.empty())
32         {
33             cout<<"No element left!"<<endl;
34             //return;
35         }
36         else
37         {
38             while(!stack1.empty())
39             {
40                 temp = stack1.top();
41                 stack1.pop();
42                 stack2.push(temp);
43             }
44             temp = stack2.top();
45             stack2.pop();
46         }
47     }
48     return temp;
49 }
50 
51 
52 
53 int main()
54 {
55     CQueue<int> my_queue;
56     int n,val;
57     cout<<"1 for Append"<<endl<<"2 for DeleteHead"<<endl;
58     while(scanf("%d",&n)!=0)
59     {
60         if(n == 1)
61         {
62             scanf("%d",&val);
63             my_queue.AppendTail(val);
64         }
65         else if(n == 2)
66         {
67             val = my_queue.DeleteHead();
68             cout<<"The head of Queue:"<<val<<endl;
69         }
70         else
71             cout<<"Illegal n!"<<endl;
72     }
73     return 0;
74 }
View Code

 

posted on 2013-09-08 17:03  CnZyy  阅读(227)  评论(0编辑  收藏  举报

导航