算法學習記錄——最小棧的實現(Java)

文章僅作爲自己學習的一個記錄,歡迎交流學習經驗,共同學習!有不當之處請指正批評!

下面的程序涉及到棧的基本操作,藉助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());
		

	}

}

 

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