數據結構第三課---棧和隊列

棧和隊列都是屬於兩種特殊的線性表,棧是隻能夠在表尾執行插入和刪除操作,也就是先進後出,但是隊列則是先進先出,只能夠在隊列的頭部出,在尾部進行添加,棧和隊列在實際中的應用還是比較多的,棧在迷宮,棋類,機器學習方面用處是比較多的,隊列的話對現實生活中的一些排隊問題的解決,模擬一些離散的事件。

棧的應用,在這通過java中的LinkList的addFirst和removeFirst,getFirst,removeAll來模擬棧的相關操作。每次添加數據將數據添加到第一位,然後之前插入的數據將會被向後移,我們通過getFirst獲得數據就是在當前棧的頂部的了。LinkList底層是通過雙向鏈表來實現的,在這裏通過 LinkList來模擬棧和隊列的實現而不是通過ArrayList來模擬的原因是,ArrayList的底層實現是通過數組來實現的,所以說其大小是一開始就分配好的了,隨着插入數據的增加,然後不斷的爲其分配內存,底層是通過順序表來實現的,所以說執行插入刪除操作的時候是比較麻煩的,但還對其遍歷是比較方便的,LinkList是通過鏈表,所以刪除,插入等操作是比較方便的,但是遍歷是比較的。棧和隊列執行的操作主要是插入,刪除,所以用LinkList來模擬。

代碼實例:

<span style="font-size:18px;">public Class Stack <T>{
	private LinkList <T> data = new LinkList <T> ();
	public void push (T) {
		data.addFirst(T);
	} 
	public T peek (){
		return data.getFirst();
	}
	public T pop (){
		return data.removeFirst();
	}
	public boolean empty (){
		return data.isEmpty();
	}
	public void clearAll () {
		data.removeAll ();
	}
}</span>
完成了棧的相關模擬,我們可以通過棧來完成一些操作了,模擬一些現實情況。

<span style="font-size:18px;">//將十進制數轉化爲八進制數
	public void convertNum (int a){
		Stack <int> stack = new Stack <int> ();
		while (a/8 != 0){
			stack.push(a%8);
			a = a/8;
		}
		stack.push(a%8);
		for (int i: stack)
			system.out.print(stack.pop());
	} 
	//檢測輸入文字中的括號是否匹配完整
	public boolean testBracket (String s){
		char a [] = s.toCharArray ();
		Stack <String> stack = new Stack <String> ();
		for (int i = 0; i < = a.length; i++){
			if (a[i] == '{' || a[i] == '(')
				stack.push(a[i]);
			else if (a[i] == '}' || a[i] == ')')
				stack.pop();
		}
		if (stack.empty())
			return true;
		return false;
	}
	//行編輯程序的模擬,退格符是#,退行符是@,
	public void lineEdit (String s){
		char a [] = s.toCharArray();
		Stack <String> stack = new Stack <String> ();
		for (int i = 0; i < a.length; i++){
			if (a[i] != '#' && a[i] != '@')
				stack.push(a[i]);
			else if (a[i] == '#'){
				if (stack.empty())
					stack.push (a[i]);
				else
				stack.pop();
		}
			else 
				stack.clearAll();
		}
	} </span>

對於棧,在遞歸中用到的,通過一個遞歸工作棧,來盛放當前處在工作狀態的函數,遞歸的過程中首先放入的必定是最後執行,類似於棧的先進後出,這樣來標記遞歸函數在執行的過程中,各個變量之間的數量變化,能夠很清晰的看到遞歸執行的整個過程。

通過LinkList來模擬隊列的實現,和棧唯一不同的地方就是在數據插入的時候,棧需要我們在第一個位置處進行插入,但是在隊列中,我們是直接在其尾部進行插入的。

<span style="font-size:18px;">public Class Queue <T>{
	private LinkList <T> queue = new LinkList <T> ();
	public void push (T){
		queue.add(T);
	}
	public T peek (T){
		return queue.getFirst();
	}
	public T pop (T){
		return queue.removeFirst();
	}  
	public boolen empty (){
		return queue.isEmpty();
	}
	public void clearAll (){
		queue.removeAll();
	}
}</span>



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