本题来源于《剑指offer》59页面试题7:用两个栈实现队列
原题如下:
用两个栈实现一个队列,队列的声明如下:请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
代码如下:
#include<stack>
#include<iostream>
using namespace std;
template <typename T> class CQueue
{
public:
CQueue(void);
~CQueue(void);
void appendTail(const T& node);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
};
template <typename T> CQueue<T>::CQueue(void)
{
}
template <typename T> CQueue<T>::~CQueue(void)
{
}
//总体思路是:将元素压入stack1,模拟一个新的元素appednTail到队列
//先压入的排在前面,同时需要使先压入的也最先出来,这要借助stack2
//模仿deleteHead时,首先判断stack2是否为空,若不为空,则执行出栈操作,
//若为空,则使stack1里面的所有元素先出栈,再进栈到stack2,这样的话,
//在前面最先压入stack1的元素将排在stack2的最上层,那么再对stack2执行出栈操作时,
//也就使得最先压入stack1的元素最先出来,便达到了deleteHead的效果。
template<typename T> void CQueue<T>::appendTail(const T& element)
{
stack1.push(element);
}
template<typename T> T CQueue<T>::deleteHead()
{
if(stack2.size()<=0)
{
while(stack1.size()>0)
{
T& data=stack1.top();
stack1.pop();
stack2.push(data);
}
}
if(stack2.size()==0)
throw new exception("queue is empty");
T head=stack2.top();
stack2.pop();
return head;
}
void Test(char actual, char expected)
{
if(actual == expected)
printf("Test passed.\n");
else
printf("Test failed.\n");
}
int main()
{
CQueue<char> queue;
queue.appendTail('a');
queue.appendTail('b');
queue.appendTail('c');
char head = queue.deleteHead();
Test(head, 'a');
head = queue.deleteHead();
Test(head, 'b');
queue.appendTail('d');
head = queue.deleteHead();
Test(head, 'c');
queue.appendTail('e');
head = queue.deleteHead();
Test(head, 'd');
head = queue.deleteHead();
Test(head, 'e');
return 0;
}
运行结果: