面试题7:用两个栈实现队列

题目链接:http://ac.jobdu.com/problem.php?pid=1512

思路:题目要求我们利用两个“先进后出”的栈实现一个“先进先出”的队列。

插入时,将插入的元素放入stack1中。假设现在stack1中已经插入了若干元素,

要进行删除操作。显然现在栈顶的元素是后插入的应该后出,栈底的元素才应该

被删除,而在stack1中无法直接删除栈底元素。此时就应该借助stack2,之前

未对stack2进行操作,stack2为空。将stack1中的元素逐个出栈压入stack2中,

那么stack2中的栈顶元素就是要删除的元素。之后要插入元素就压入stack1中,

要删除元素就将stack2栈顶元素删除,若stack2为空,则将stack1的全部元素

逐个出栈压入stack2中,再完成删除,若stack1和stack2都为空,无法完成删除操作。

注意:

1、本题最好写成模板,更为通用。

2、可以写个判断队列是否非空的函数。

code:

 1 #include <iostream>
 2 #include <stack>
 3 #include <string>
 4 using namespace std;
 5 
 6 template<typename T> class CQueue
 7 {
 8 public:
 9     CQueue(void);
10     ~CQueue(void);
11 
12     void appendTail(const T& node);
13     T deleteHead();
14     bool empty();
15 private:
16     stack<T> stack1;
17     stack<T> stack2;
18 };
19 
20 //构造函数
21 template<typename T> CQueue<T>::CQueue(void)
22 {
23     ;
24 }
25 
26 //析构函数
27 template<typename T> CQueue<T>::~CQueue(void)
28 {
29     ;
30 }
31 
32 template<typename T> void CQueue<T>::appendTail(const T& element)
33 {
34     stack1.push(element);
35 }
36 
37 template<typename T> T CQueue<T>::deleteHead()
38 {
39     if (stack2.size() <= 0)
40     {
41         while (stack1.size() > 0)
42         {
43             T& data = stack1.top();
44             stack1.pop();
45             stack2.push(data);
46         }
47     }
48 
49     T head = stack2.top();
50     stack2.pop();
51     return head;
52 }
53 
54 template<typename T> bool CQueue<T>::empty()
55 {
56     if (stack1.size() + stack2.size() <= 0) return true;
57     return false;
58 }
59 
60 
61 int main()
62 {
63     int n;
64     while (cin >> n)
65     {
66         CQueue<int> myQuence;
67         for (int i = 0; i < n; ++i)
68         {
69             string myStr;
70             cin >> myStr;
71             if (myStr == "PUSH")
72             {
73                 int k;
74                 cin >> k;
75                 myQuence.appendTail(k);
76             }
77             else
78             {
79                 if (myQuence.empty()) cout << -1 << endl;
80                 else cout << myQuence.deleteHead() << endl;
81             }
82         }
83     }
84     return 0;
85 }

 

posted @ 2015-04-09 09:04  jasaiq  阅读(223)  评论(0编辑  收藏  举报