题目描述:
解:注意首先要求是一个栈,即先进后出
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
输入: 输入可能包含多个测试样例,输入以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();
}
}
}
}
}