定义栈的数据结构,请在该类型中实现一个可以获得栈最小元素的min函数。 java
输入: 输入可能包含多个测试样例,输入以EOF结束。
对于每一个测试案例,输入的第一行为一个整数n(1<=n<=1000000), n表明将要输入的操做的步骤数。
接下来有n行,每行开始有一个字母Ci。
Ci=’s’时,接下有一个数字k,表明将k压入栈。
Ci=’o’时,弹出栈顶元素。 数据结构
对应每一个测试案例中的每一个操做,
若栈不为空,输出相应的栈中最小元素。不然,输出NULL。 函数
7 s 3 s 4 s 2 s 1 o o s 0样例输出:
3 3 2 1 2 3 0
解题思路:使用两个栈,一个是普通的数据栈,data,和另一个help辅助栈,首先在空的时候都压入两个栈,而后对于压入的序列,比较 这个元素和辅助栈栈顶元素,若是小于这个栈顶那么在压入数据栈的时候也压入辅助站,不然,将辅助栈的顶部元素再次压入一次,这样保证了两个栈的大小相等, 这样才能在pop的时候同步。这样须要的空间就是两个相等的栈 。 测试
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StreamTokenizer; import java.util.Stack; /** * 两个栈方法 * @author aqia358 * */ public class Main { public Stack<Integer> data = new Stack<Integer>(); public Stack<Integer> help = new Stack<Integer>(); public void push(int value){ data.push(value); if(help.isEmpty()){ help.push(value); System.out.println(value); }else{ int temp = help.peek(); if(temp < value){ help.push(temp); System.out.println(temp); }else{ help.push(value); System.out.println(value); } } } public void pop(){ if(help.isEmpty()){ System.out.println("NULL"); }else{ data.pop(); help.pop(); if(help.isEmpty()){ System.out.println("NULL"); }else System.out.println(help.peek()); } } public static void main(String[] args) throws IOException { StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); while(st.nextToken() != StreamTokenizer.TT_EOF){ int n = (int)st.nval; Main m = new Main(); for(int i = 0; i < n; i++){ st.nextToken(); String op = st.sval; if(op.equals("s")){ st.nextToken(); int data = (int)st.nval; m.push(data); }else if(op.equals("o")){ m.pop(); } } } } }