2014.06.14 21:04

简介:

  队列作为先进先出(FIFO)思想的代表,是最基础的数据结构之一,最典型的应用,就是广度优先搜索。实现方式可以用一条单链表或者两个栈,其中前者更为靠谱,原因请自行分析。

图示:

  下图为单链表实现队列的思路。链表的头尾位置分别被记录,因此很容易实现尾进头出的操作。

  

  另一种思路是用两个栈实现一个队列,主要思路就是颠来倒去,两个栈的先进先出叠加起来,成为了先进后出。我下面的代码居然是这种方案的,看来当时直接拿了自己之前写过的代码偷懒,于是就没实现链表版的队列。用两个栈来实现队列,貌似也是一道烂大街的面试题,所以学会这个思路还是很有必要的。

  

实现:

 1 // My implementation of queue with two stacks.
 2 #include <stack>
 3 using namespace std;
 4 
 5 class Queue {
 6 public:
 7     Queue() {}
 8     
 9     void push(int val) {
10         s1.push(val);
11     }
12     
13     void pop() {
14         if (s2.empty()) {
15             while (!s1.empty()) {
16                 s2.push(s1.top());
17                 s1.pop();
18             }
19         }
20         s2.pop();
21     }
22     
23     int size() {
24         return s1.size() + s2.size();
25     }
26     
27     bool empty() {
28         return size() == 0;
29     }
30     
31     int front() {
32         if (s2.empty()) {
33             while (!s1.empty()) {
34                 s2.push(s1.top());
35                 s1.pop();
36             }
37         }
38         
39         return s2.top();
40     }
41     
42     int back() {
43         if (s1.empty()) {
44             while (!s2.empty()) {
45                 s1.push(s2.top());
46                 s2.pop();
47             }
48         }
49         
50         return s1.top();
51     }
52     
53     ~Queue() {
54         while (!s1.empty()) {
55             s1.pop();
56         }
57         while (!s2.empty()) {
58             s2.pop();
59         }
60     }
61 private:
62     stack<int> s1, s2;
63 };
64 
65 int main()
66 {
67     return 0;
68 }

 

 posted on 2014-06-14 21:32  zhuli19901106  阅读(846)  评论(0编辑  收藏  举报