【九度OJ1522】|【劍指offer21】包含min函數的棧

題目描述:

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