《剑指offer—面试题30:包含main函数的栈》
注明:仅个人学习笔记
import java.util.Stack;
public class FindStackMin30
{
Stack<Integer> dataStack = new Stack<Integer>();
Stack<Integer> minStack = new Stack<Integer>();// 辅助栈的栈顶元素时刻都是当前数据栈中的最小元素
public void push(int node)
{
dataStack.push(node);// 数据栈压入元素
if (minStack.isEmpty())// 如果当前辅助栈中无元素,当前元素直接压入
minStack.push(node);
else
{
if (node <= minStack.peek())// 如果当前辅助栈中有元素,且当前待压入节元素小于辅助栈栈顶元素,那就直接压入
minStack.push(node);
else
minStack.push(minStack.peek());// 否则,再次压入辅助栈的当前栈顶元素
}
}
public void pop()
{
if (dataStack.isEmpty() == true && minStack.isEmpty() == true)
{
System.out.println("栈中以无元素,无法执行pop操作");
return;
}
dataStack.pop();
minStack.pop();
}
public int top()
{
if (dataStack.isEmpty() == true && minStack.isEmpty() == true)
{
System.out.println("栈中以无元素,当前栈不存栈顶元素");
return Integer.MIN_VALUE;
}
return dataStack.peek();
}
public int min()
{
if (dataStack.isEmpty() == true && minStack.isEmpty() == true)
{
System.out.println("栈中以无元素,当前栈不存在最小值");
return Integer.MIN_VALUE;
}
return minStack.peek();// 辅助栈栈顶元素,总为当前数据栈中最小元素
}
public static void main(String[] args)
{
FindStackMin30 stack = new FindStackMin30();
stack.push(3);
System.out.println("-------------数据栈中当前元素是,3---------------");
System.out.println("当前栈中最小元是" + stack.min());
System.out.println();
stack.push(4);
System.out.println("-------------数据栈中当前元素是,3,4---------------");
System.out.println("当前栈中最小元是" + stack.min());
System.out.println();
stack.push(2);
System.out.println("-------------数据栈中当前元素是,3,4,2---------------");
System.out.println("当前栈中最小元是" + stack.min());
System.out.println();
stack.push(1);
System.out.println("-------------数据栈中当前元素是,3,4,2,1---------------");
System.out.println("当前栈中最小元是" + stack.min());
System.out.println();
stack.pop();
System.out.println("-------------数据栈中当前元素是,3,4,2---------------");
System.out.println("当前栈中最小元是" + stack.min());
System.out.println();
stack.pop();
System.out.println("-------------数据栈中当前元素是,3,4---------------");
System.out.println("当前栈中最小元是" + stack.min());
System.out.println();
stack.push(0);
System.out.println("-------------数据栈中当前元素是,3,4,0---------------");
System.out.println("当前栈中最小元是" + stack.min());
System.out.println();
stack.pop();
stack.pop();
stack.pop();
stack.pop();
stack.top();
stack.min();
}
}