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 }