一.题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail
和 deleteHead
,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
二.思路
使用两个栈stack1和stack2,若添加元素则直接压入栈stack1中;若删除元素,则要分情况:
- 如果栈stack2为空,则把栈stack1中的元素弹出压入栈stack2中,此时从栈stack2中弹出数据的顺序符合队列的特点(先进先出)
- 如果栈stack2非空,则直接弹出栈stack2顶部元素即可
三.代码
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>void CQueue<T>::appendTail(const T& element){ stack.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; }
四.本题考点
- 考查应聘者对栈和队列的理解
- 考查应聘者写与模板相关的代码的能力
- 考查应聘者分析复杂问题的能力。应聘者能否通过具体的例子分析问题,通过画图的手段把抽象的问题具体化,从而解决这个相对复杂的问题,是能否顺利通过面试的关键。