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

来源:互联网 发布:手机淘宝首页多宽 编辑:程序博客网 时间:2024/05/15 05:48

题目:用两个队列实现一个栈。实现两个函数push和pop,完成从栈顶插入和删除结点的功能。

思路:

(1)入栈:总是插入到非空队列

(2)出栈:将非空队列中的前n-1个元素依次出队列push进空队列中,然后将最后一个元素出队列,完成出栈操作。


C++代码:

#include "stdafx.h"#include <iostream>#include <deque>#include <assert.h>using namespace std;// 两个队列实现一个栈template<class T>class CStack{public:CStack() {}~CStack() {}void PushData(const T& element);void PopData(T& element);private:deque<T> m_queue1;deque<T> m_queue2;};template<class T> void CStack<T>::PushData(const T& element){if (m_queue1.size() > 0){m_queue1.push_back(element);}else if (m_queue2.size() > 0){m_queue2.push_back(element);}else{m_queue1.push_back(element);}}template<class T>void CStack<T>::PopData(T& element){if (m_queue1.size() == 0){while (m_queue2.size() > 1){T& data = m_queue2.front();m_queue2.pop_front();m_queue1.push_back(data);}assert(m_queue2.size() == 1); //确保队列2内有一个元素element = m_queue2.front();m_queue2.pop_front();}else if (m_queue2.size() == 0){while (m_queue1.size() > 1){T& data = m_queue1.front();m_queue1.pop_front();m_queue2.push_back(data);}assert(m_queue1.size() == 1); //确保队列1内有一个元素element = m_queue1.front();m_queue1.pop_front();}}int main(){CStack<int> myStack;int nPopData = 0;myStack.PushData(1);myStack.PushData(2);myStack.PushData(3);myStack.PopData(nPopData);cout << nPopData << endl;myStack.PushData(4);myStack.PopData(nPopData);cout << nPopData << endl;system("pause");return 0;}