面试题六 用两个栈实现队列

题目

  用两个栈实现队列的进队和出队功能

分析

  1. 栈直接用C++的容器适配器 stack 实现

  2. 当进队时,直接往栈 1 存放数据;当出队时,如果栈 2 非空则直接从栈 2 取数,否则将栈 1 的数据全部出栈并转移至栈 2,然后再从栈 2 取数

  3. 考虑到这里采用的两个栈应当要封装起来,因此,采用来实现这个队列。

代码实现

 1 #include <iostream>
 2 #include <stack>
 3 
 4 using namespace std;
 5 
 6 // 队列定义
 7 class SQueue {
 8 public:
 9     SQueue (void) {
10     }
11     ~SQueue (void) {
12     }
13     // 入队函数
14     void appendTail (const int n);
15     // 出队函数
16     int deleteHead();
17     // 队判空函数
18     bool empty();
19 private:
20     stack <int> s1; // 使用容器适配器实现栈
21     stack <int> s2;
22 };
23 
24 void SQueue :: appendTail (const int n) {
25     s1.push (n);
26 }
27 
28 int SQueue :: deleteHead() {
29     int tem;
30     // 首先将第二个栈的元素出栈,如果第二个栈中没有元素可出了,那么就将第一个栈中的元素转移到第二个栈中来。
31     if (s2.size() == 0) {
32         while (s1.size() != 0) {
33             tem = s1.top();
34             s1.pop();
35             s2.push(tem);
36         }
37     }
38 
39     tem = s2.top();
40     s2.pop();
41 
42     return tem;
43 }
44 
45 bool SQueue :: empty() {
46     // 两个栈都为空则说明队列为空
47     if (s1.size() == 0 && s2.size() ==0) 
48         return 1;
49     else return 0;
50 }
51 
52 int main (void) {
53     SQueue q;
54 
55     // 将 9 5 4 7 这四个整数进队
56     q.appendTail(9);
57     q.appendTail(5);
58     q.appendTail(4);
59     q.appendTail(7);
60 
61     // 让之前进队的四个数出队并打印
62     int num;
63     while (!q.empty()) {
64         num = q.deleteHead();
65         cout << num << " ";
66     }
67     cout << endl;
68 
69     return 0;
70 }

小结

  1. 本题只要求实现入队和出队函数,其实可以继续添加机制完善这个队列:如复制控制,空间限制等

 

posted on 2014-04-09 17:20  空山悟  阅读(346)  评论(0编辑  收藏  举报

导航