一.题目:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和队列头部删除结点的功能。
template <typename T> class CQueue
{
public:
CQueue(void);
~CQueue(void);
void appendTail(const T& node);
void deleteHead();
private:
stack(T) stack1;
stack(T) stack2;
}
二.分析:
两个栈的功能分别设计为进栈和出栈。appendTail的过程为stack1的进栈,deleteHead的过程为stack2的出栈,当stack2为空时,再将进栈stack1中的数据全部pop到stack2中,再pop出stack2中的数据即可。
三.答案:
template <typename T> void CQueue<T>::appendTail(const T& element) {
stack1.push(element);
}
template <typename T> void 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;
}
四.相关题目:
1.在O(1)时间内找到栈的最大值或者最小值:
(1)面试题21:包含min函数的栈
2.树的遍历:
(1)面试题23:从上到下遍历二叉树
3.栈和队列的相互联系:
(1)面试题7:用两个栈实现队列,同时也可以考虑用两个队列实现一个栈