如何用兩個棧實現一個隊列?

問題:如何用兩個棧實現一個對列的功能?

思路:從棧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

相關文章
相關標籤/搜索