如何用两个栈实现一个队列?

问题:如何用两个栈实现一个对列的功能?

思路:从栈A入队列,从栈B出队列。(队列的2个最重要的操做,入队列,出队列。)ios

  • 入队列:从栈A入队列。
  • 出队列:分两种状况
    • 若是栈B不为空,直接弹出。
    • 若是栈B为空,将栈A中的数据所有弹入栈B中,再从栈B弹出数据

代码实现以下:ui

// QueueByStack.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<stack>
#include<iostream>
using namespace std;

template<class T> class Queue {
public:
	Queue(){}
	virtual ~Queue(){}
	void push(const T& e){
		m_stackA.push(e);
	}
	void pop(){
		if(m_stackB.empty()){
			while(!m_stackA.empty()){
				m_stackB.push(m_stackA.top());
				m_stackA.pop();
			}
		}
		m_stackB.pop();
	}
	size_t size() const{
		return m_stackA.size()+m_stackB.size();
	}
	bool empty(){
		return m_stackA.empty()&&m_stackB.empty();
	}
	T top(){
		if(m_stackB.empty()){
			while(!m_stackA.empty()){
				m_stackB.push(m_stackA.top());
				m_stackA.pop();
			}
		}
		return m_stackB.top();
	}

protected:
	stack<T> m_stackA;	//栈A
	stack<T> m_stackB;	//栈B
};


int _tmain(int argc, _TCHAR* argv[])
{
	Queue<int> m_queue;
	m_queue.push(1);
	m_queue.push(2);
	cout<<m_queue.top();

	return 0;
}
复制代码

引伸思考:如何用两个队列实现一个栈的功能?

思路:
举个例子:有D-->C-->B-->A数据依次入栈,输出顺序应该是A-->B-->C-->D
先将D-->C-->B-->A入队列1,将C-->B-->A弹出到队列2,只留一个,弹出D
再将队列2中全部数据入队列1,继续上面的步骤......
大致就这个思路。spa

相关文章
相关标签/搜索