用两个栈实现最小栈的功能(取栈中最小数):
package com.neusoft.data.structure;
import java.util.Stack;
/**
* 用两个栈实现最小栈的功能
* @author Administrator
*/
public class MyStack1 {
/**
* 数据栈
*/
private Stack<Integer> stackData;
/**
* 最小栈
*/
private Stack<Integer> stackMin;
public MyStack1(){
this.stackData=new Stack<Integer>();
this.stackMin=new Stack<Integer>();
}
public int pop(){
if(this.stackData.isEmpty()){
System.out.println("你的栈是空的");
}
int value=this.stackData.pop();
//同步一下,data栈已经移走了,且是最小,那么最小栈也应该移走最小的
if(value==this.getmin()){
this.stackMin.pop();
}
return value;
}
public void push(int newNum){
//如果为空
if(this.stackMin.isEmpty()){
//压栈
this.stackMin.push(newNum);
//如果不为空,则比较newNum和stackMin的栈顶元素中哪个更小
}else if(newNum<this.getmin()){
//如果newNum更小或者两者相等,则newNum也压入stackMin。
this.stackMin.push(newNum);
}
this.stackData.push(newNum);
}
public int getmin(){
if(this.stackMin.isEmpty()){
System.out.println("你的栈是空的");
}
//返回栈顶的元素
return this.stackMin.peek();
}
public static void main(String[] args) {
MyStack1 stack1 = new MyStack1();
//压入的是数据栈和最小栈
stack1.push(3);
//返回的是最小栈栈顶
System.out.println("第一次输出最小:"+stack1.getmin());
//压入的是数据栈和最小栈
stack1.push(4);
//返回的是最小栈栈顶
System.out.println("第二次输出最小:"+stack1.getmin());
stack1.push(1);
System.out.println("第三次输出最小:"+stack1.getmin());
//移走数据栈,如果移走的和最小栈栈顶元素相同,最小栈也移走,返回移走的值
System.out.println("经过弹出,弹出此时最小值:"+stack1.pop());
//现在的栈情况,最上面是1
System.out.println("弹出后,现在栈顶的值:"+stack1.getmin());
System.out.println("=============");
}
}
输出: