文章僅作爲自己學習的一個記錄,歡迎交流學習經驗,共同學習!有不當之處請指正批評!
下面的程序涉及到棧的基本操作,藉助JAVA中的內置Stack實現,進入程序前,先就本實例中Stack的相關方法進行介紹:
- push(int element):入棧操作,將element元素放入棧中。
- pop():出棧操作,將當前棧頂元素取出(刪除)並返回當前元素。
- peek():獲取當前棧頂元素,並返回當前元素的值,不刪除棧頂元素。
實現獲取棧中最小值的思路:
兩個棧:
主棧存放正常的數據元素;
最小棧存放主棧中的當前最小值數據元素;
在出棧和入棧操作時,用最小棧中的棧頂元素和當前要入棧(或出棧)的元素進行比較,如果是最小值,就進行入棧或者出棧操作,否則最小棧不變。
當前程序說明:
主類:class MinStack
成員屬性(Stack 類的對象):mainStack(主棧) 和 minStack(最小棧)
成員方法:
push(int element):入棧
pop():出棧
getMin():獲取棧中最小值
import java.util.Stack;
public class MinStack {
private Stack<Integer> mainStack=new Stack<Integer>();
private Stack<Integer> minStack=new Stack<Integer>();
//出棧操作 返回主棧mainStac.pop();
//主棧直接出棧就可以,即mainStack.pop();
//最小棧要跟主棧當前的出棧元素進行大小比較,如果當前主棧的出棧元素與最小棧中的棧頂元素相同,那最小棧minStack也調用minStack.pop(),即出棧操作
public int pop() {
if(mainStack.peek()==minStack.peek()) {
minStack.pop();
}
return mainStack.pop();
}
//入棧操作 無返回值,直接將需要入棧的數據push進當前棧即可,即調用mainStack.push();
//這裏要判斷最小棧minStack是否需要進行入棧操作,條件是當前入棧元素是否小於或者等於當前最小棧minStack中的棧頂元素,如果小於或者等於,那就也進行入棧操作,即minStack.push();
public void push(int element) {
mainStack.push(element);
if(minStack.empty() || element<=minStack.peek()) {
minStack.push(element);
}
}
//獲取主棧中的最小值,getMin()方法
//取值前先判斷一下主棧是否爲空
public int getMin()throws Exception {
if(mainStack.empty()) {
throw new Exception("mainStack is empty!!!!!");
//System.out.println("mainStack is empty!!!!!");
}
return minStack.peek();
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
MinStack stack=new MinStack();
stack.push(10);
stack.push(65);
stack.push(3);
stack.push(51);
stack.push(90);
stack.push(1);
stack.push(80);
stack.push(38);
stack.push(73);
System.out.println(stack.getMin());
stack.pop();
stack.pop();
stack.pop();
stack.pop();
stack.pop();
System.out.println(stack.getMin());
}
}