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

170 阅读1分钟

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

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

  • 入队列:从栈A入队列。
  • 出队列:分两种情况
    • 如果栈B不为空,直接弹出。
    • 如果栈B为空,将栈A中的数据全部弹入栈B中,再从栈B弹出数据

代码实现如下:

//2个栈实现一个队列
#include<stack>
#include<cassert>
#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 main() {
	Queue<int> m_queue;
	m_queue.push(1);
	m_queue.push(2);
    assert(m_queue.top() == 1);
    m_queue.pop();
    assert(2 == 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,继续上面的步骤......
大体就这个思路。