棧與隊列(2)

案例1
實現一個特殊棧,在實現基礎棧功能基礎上,能返回棧中最小元素的操作getmin
要求:
1.pop、push、getMin操作時間複雜度都是O(1)。
2.設計的棧類型可以使用現成的棧結構。
方法1:兩個棧,一個棧正常stackData,一個棧stackmin用於記錄最小值
壓入效果如圖,stackmin只壓入比棧頂小的值。
這裏寫圖片描述
彈出的步驟:
這裏寫圖片描述
這樣stackmin在彈出過程維持着最小值。

方法二:
壓入方式:
這裏寫圖片描述
彈出數據時,兩個棧彈出即可。

比較:方案1稍費時間,略省時間;方案2稍省空間,略費時間;

案例2
編寫一個類,只能用兩個棧結構實現隊列,支持隊列的基本操作(add、poll、peek)

解:兩個棧,一個壓入棧(只負責壓入),一個彈出棧(只負責彈出)。
切換操作時,需兩棧數據倒入
這裏寫圖片描述

這裏寫圖片描述

注意:每次倒數據,一定要一次性倒完。

案例3
實現一個棧的逆序,但只能用遞歸函數和這個棧本身的操作來實現,而不能自己申請另外的數據結構

代碼一:

public int get(Stack<Integer> stack){
   int result=stack.pop();
   if(stack.isEmpty()){
       return result;
   }
   else{
       int last=get(stack);
       stack.push(result);
       return last;
   }
}

該函數功能爲,移除棧頂元素並返回。
這裏寫圖片描述

這裏寫圖片描述

利用代碼1,完成這題
代碼2:

public void reverse(Stack<Integer> stack){
   if(stack.isEmpty()){
       return;
   }
   int i=get(stack);
   reverse(stack);
   stack.push(i);
}

這裏寫圖片描述

這裏寫圖片描述

案例4
想將一個整型棧從頂到底按從大到小排序,只許申請一個棧,除此之外可以申請新的變量,但不能申請額外數據結構,如何實現?

申請個help棧,原棧stack
1.stack彈出棧頂,壓入help中
2.stack彈出棧頂,與help棧頂比較,若小,壓入help。若大,將help元素逐漸彈出,重新壓回stack,然後把該元素壓入help。
3.重複2,直到stack空,然後把help完全壓入stack,結束。

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