题目
用两个栈实现队列的进队和出队功能
分析
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. 本题只要求实现入队和出队函数,其实可以继续添加机制完善这个队列:如复制控制,空间限制等。