文章仅作为自己学习的一个记录,欢迎交流学习经验,共同学习!有不当之处请指正批评!
下面的程序涉及到栈的基本操作,借助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());
}
}