《劍指Offer》第二版之用兩個棧實現隊列(六)

目錄


題目:
用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數appendTail和deleteHead,分別完成在隊列尾部插入節點和在隊列頭部刪除節點的功能。
template <typename T> class CQueue
{
public :
	CQueue(void);
	~CQueue(void);
	
	void appendTail(const T& node);
	T deleteHead();
private:
	stack<T> stack1;
	stack<T> stack2;
}

思路:
從上述隊列的聲明中可以看出,一個隊列包含了兩個棧stack1和stack2,因此這道題的意圖是要求我們操作這兩個”先進後出“的棧實現一個”先進先出“的隊列CQueue.
步驟:
1.stack1用來保存入隊列數據.
2.當stack2不爲空時,在stack2中的棧頂元素是最先進入隊列的元素,可以彈出。當stack2爲空時,我們把stack1中的元素逐個彈出並壓入stack2。由於先進入隊列的元素被壓到stack1的底端,經過彈出和壓入操作之後就處於stack2的頂端,又可以直接彈出。
代碼:
package test;

import java.util.Stack;

public class CQueue<T> {

	private Stack<T> stack1 = new Stack<>();
	private Stack<T> stack2 = new Stack<>();
	
	//隊列添加元素
	public void appendTail(T t) {
		stack1.push(t);
	}
	
	//隊列刪除元素
	public T deleteHead() {
		if(stack2.size() <= 0) {
			while(stack1.size() > 0) {
				T data = stack1.pop();
				stack2.push(data);
			}
		}

		return stack2.pop();
	}
	
	public static void main(String[] args) {
		CQueue<Integer> cQueue = new CQueue<>();
		cQueue.appendTail(1);
		cQueue.appendTail(2);
		cQueue.appendTail(3);
		System.out.println(cQueue.deleteHead());
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章