题目:用两个队列实现一个栈。栈的声明如下,同学习笔记9类似。请实现它的两个函数appendTail和deleteHead,分别完成在栈中压入一个结点和弹出一个节点的功能。
思路:同笔记9类似,可通过画图形象化理解。元素压入的时候,保持一个队列为空,一个队列不为空,往不为空的队列中插入元素;弹出一个元素e时,从非空队列q1(或q2,后同)入手,将e之前的元素统统插入队列q2并在q1中删除它们,然后删除q1中的元素e,就相当于实现了栈顶元素的弹出。
完整实现代码如下:
#include <iostream>
#include <queue>
#include <exception>
using namespace std;
template <typename T>
class CStack{
public:
CStack(void);
~CStack(void);
// 往栈中压入一个结点
void appendTail(const T& node);
// 从栈中弹出一个结点
T deleteHead();
private:
queue<T> queue1;
queue<T> queue2;
};
template <typename T>
CStack<T>::CStack(void){}
template <typename T>
CStack<T>::~CStack(void){}
template <typename T>
void CStack<T>::appendTail(const T& element){ //保持一个队列为空,一个队列不为空,压入元素时,往不为空的队列中压入
if(!queue1.empty())
queue1.push(element);
else
queue2.push(element);
}
template <typename T>
T CStack<T>::deleteHead(){ //实现栈元素的弹出
int head = 0;
if(!queue1.empty()){
int num = queue1.size();
while(num > 1){
queue2.push(queue1.front());
queue1.pop();
num--;
}
head = queue1.front();
queue1.pop();
}
else{
int num = queue2.size();
while(num > 1){
queue1.push(queue2.front());
queue2.pop();
num--;
}
head = queue2.front();
queue2.pop();
}
return head;
}
//测试函数
void Test(int actual, int expected){
if(actual == expected)
cout << "Test passed." << endl;
else
cout << "Test failed." << endl;
}
int main(){
CStack<int> queue;
queue.appendTail(1);
queue.appendTail(2);
queue.appendTail(3);
int head = queue.deleteHead();
Test(head, 3);
queue.appendTail(4);
head = queue.deleteHead();
Test(head, 4);
head = queue.deleteHead();
Test(head, 2);
head = queue.deleteHead();
Test(head, 1);
//本测试用例中,程序运行结果应为4行Test passed.
return 0;
}