案例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,結束。