面试题 7,用两个栈实现队列

原题在P75
思路:一个栈用于进,需要删除时,把所有的元素从一个栈移到另一个栈中,从栈顶删除。因为经过两次进栈,顺序变成了先进的在栈顶,这样可以做到先进先出。
代码:
template <typename T> class CQueue void CQueue::appendTail(const T& node){ while(!stack2.empty()){ stack1.push(stack2.top()); stack2.pop(); } stack1.push(node); } T CQueue::deleteHead(){ while(!stack1.empty()){ stack2.push(stack1.top()); stack1.pop(); } if(stack2.empty) printf("%s\n0", "Queue already empty"); else{ T node = stack2.top(); stack2.pop(); return node; } }
和答案对照,思路基本一致。
不同之处在于:
1. 函数的定义返回值类型错误,不是在函数定义前写模板申明,而是直接在函数的返回值上加入template。
2. stack1 和stack2之间的元素移动时,最好使用&引用,这样确保移动的是同一个对象。deleteHead() 返回值由于已经规定是T,不用引用。
3. 栈空时,最好throw 异常,更加专业些。
修改后的代码:
template<typename T> void CQueue<T>::appendTail(const T& node){//更改 while(!stack2.empty()){ T &data = stack2.top(); //更改 stack1.push(data); stack2.pop(); } stack1.push(node); } template<typename T> T CQueue<T>::deleteHead(){ while(!stack1.empty()){ T &data = stack1.top(); stack2.push(data); stack1.pop(); } if(stack2.empty) throw new std::Exception("Queue already empty");//更改 else{ T node = stack2.top(); //更改 stack2.pop(); return node; } }
------------------------------------------------
Felix原创,转载请注明出处,感谢博客园!
posted on 2013-11-26 20:46 Felix Fang 阅读(160) 评论(0) 收藏 举报
浙公网安备 33010602011771号