用两个栈实现队列 【微软面试100题 第五十七题】
2014-11-12 23:39
417 查看
题目要求:
某队列的声明如下:
用两个栈实现队列,实现appendTail()和deleteHead(),分别完成在队列尾部插入结点和在队列头部删除结点的功能。
题目分析:
压栈的时候往stack1中压,出栈的时候,如果stack2不为空则,直接出栈stack2,如果stack2空,则把stack1的所有元素依次压入stack2,然后再出栈stack2。举个例子,如下图所示:
代码实现:
某队列的声明如下:
template<typename T> class CQueue { public: CQueue() {} ~CQueue() {} void appendTail(const T& node); // append a element to tail void deleteHead(); // remove a element from head private: Stack<T> m_stack1; Stack<T> m_stack2; };
用两个栈实现队列,实现appendTail()和deleteHead(),分别完成在队列尾部插入结点和在队列头部删除结点的功能。
题目分析:
压栈的时候往stack1中压,出栈的时候,如果stack2不为空则,直接出栈stack2,如果stack2空,则把stack1的所有元素依次压入stack2,然后再出栈stack2。举个例子,如下图所示:
代码实现:
#include <iostream> #include <stack> using namespace std; template<class T> class CQueue { public: CQueue() {} ~CQueue() {} void appendTail(const T& node); T deleteHead(); private: stack<T> m_stack1; stack<T> m_stack2; }; template<class T> void CQueue<T>::appendTail(const T& node) { m_stack1.push(node); } template<class T> T CQueue<T>::deleteHead() { if(m_stack2.size()==0) { while(m_stack1.size()) { T data = m_stack1.top(); m_stack1.pop(); m_stack2.push(data); } } if(m_stack2.size()==0) throw new exception("queue is empty"); T top = m_stack2.top(); m_stack2.pop(); return top; } int main(void) { CQueue<int> queue; queue.appendTail(1); queue.appendTail(2); cout << queue.deleteHead()<<endl; queue.appendTail(3); cout << queue.deleteHead()<<endl; cout << queue.deleteHead()<<endl; return 0; }
相关文章推荐
- 用两个栈实现队列 【微软面试100题 第五十七题】
- 微软100题(57)两个栈实现队列
- 实现一个队列 【微软面试100题 第三十四题】
- 微软等数据结构+算法面试100题(33)--用俩个栈实现队列
- 实现一个队列 【微软面试100题 第三十四题】
- 【100题】第五十七题 用两个栈实现队列
- 【100题】第五十七题 用两个栈实现队列
- 微软面试100题-57 (用俩个栈实现队列)
- 程序员面试题精选100题(18)-用两个栈实现队列
- 程序员面试题精选100题(18)-用两个栈实现队列
- (微软面试100题)判断两个链表是否相交
- 微软等数据结构+算法面试100题(38)-- 二叉树中任意两个节点间的最大距离
- 找出数组中两个只出现一次的数字 【微软面试100题 第六十一题】
- 面试算法(六)用两个栈实现队列
- 程序员面试题精选100题(18)-用两个栈实现队列
- 两个闲玩娱乐 【微软面试100题 第六十七题】
- 微软等数据结构+算法面试100题(14)--实现strstr 功能
- 微软、谷歌、百度等公司经典面试100题[第1-60题]——自己的实现
- 微软、谷歌、百度等公司经典面试100题[第1-60题]——自己的实现[转]
- 找出数组中两个只出现一次的数字 【微软面试100题 第六十一题】