定義棧的數據結構,請在該類型中實現一個可以獲得棧最小元素的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(); } } } } }