面试题7:用两个栈实现队列
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
用两个栈模拟一个队列的操作:
代码如下:
#include <iostream>
#include <stack>
using namespace std;template <typename T>
class CQueue
{
public:CQueue(void);~CQueue(void);void appendTail(const T&element);T deleteHead();private:stack<T>stack1;stack<T>stack2;
};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;
}
测试用例:
● 往空的队列里添加、删除元素。
● 往非空的队列里添加、删除元素。
● 连续删除元素直至队列为空。
本题考点:
● 考查对栈和队列的理解。
● 考查写与模板相关的代码的能力。
● 考查分析复杂问题的能力。本题解法的代码虽然只有只有20几行代码,但形成正确的思路却不容易。应聘者能否通过具体的例子分析问题,通过画图的手段把抽象的问题形象化,从而解决这个相对比较复杂的问题,是能否顺利通过面试的关键。