java棧與隊列面試題

設計含最小函數min()的棧,要求min、push、pop、的時間複雜度都是O(1)。min方法的做用是:就能返回是棧中的最小值。【微信面試題】java

普通思路:
通常狀況下,咱們可能會這麼想:利用min變量,每次添加元素時,都和min元素做比較,這樣的話,就能保證min存放的是最小值。可是這樣的話,會存在一個問題:若是最小的元素出棧了,那怎麼知道剩下的元素中哪一個是最小的元素呢?面試

改進思路:
這裏須要加一個輔助棧,用空間換取時間。輔助棧中,棧頂永遠保存着當前棧中最小的數值。具體是這樣的:原棧中,每次添加一個新元素時,就和輔助棧的棧頂元素相比較,若是新元素小,就把新元素的值放到輔助棧中,若是新元素大,就把輔助棧的棧頂元素再copy一遍放到輔助棧的棧頂數組

package study;

import java.util.Stack;
 

public class MinStack {
 
private Stack<Integer> stack = new Stack<Integer>();
 private Stack<Integer> minStack = new Stack<Integer>(); //輔助棧:棧頂永遠保存stack中當前的最小的元素
 
public void push(int data) {
  stack.push(data); //直接往棧中添加數據
 
//在輔助棧中須要作判斷
  if (minStack.size() == 0 || data < minStack.peek()) {
   minStack.push(data);
  } else {
   minStack.add(minStack.peek()); //【核心代碼】peek方法返回的是棧頂的元素
  }
 }
 
public int pop() throws Exception {
  if (stack.size() == 0) {
   throw new Exception("棧中爲空");
  }
 
int data = stack.pop();
  minStack.pop(); //核心代碼
  return data;
 }
 
public int min() throws Exception {
  if (minStack.size() == 0) {
   throw new Exception("棧中空了");
  }
  return minStack.peek();
 }
 
public static void main(String[] args) throws Exception {
  MinStack stack = new MinStack();
  stack.push(4);
  stack.push(3);
  stack.push(5);
System.out.println(stack.min());
 }
}

已知一組數據一、二、三、四、5依次進棧,那麼它的出棧方式有不少種,請判斷一下給出的出棧方式是不是正確的?微信

例如:
數據:
一、二、三、四、5
出棧1:
五、四、三、二、1(正確)
出棧2:
四、五、三、二、1(正確)
出棧3:
四、三、五、一、2(錯誤)函數

一個數據進棧,它可能立刻出棧,也可能一下子再出棧。設計

package study;

import java.util.Stack;
//方法:data1數組的順序表示入棧的順序。如今判斷data2的這種出棧順序是否正確   
public class StackTest {
public static boolean sequenseIsPop(int[] data1, int[] data2) {       
	Stack<Integer> stack = new Stack<Integer>(); //這裏須要用到輔助棧
	for (int i = 0, j = 0; i < data1.length; i++) {            
		stack.push(data1[i]);
		while (stack.size() > 0 && stack.peek() == data2[j]) {               
			stack.pop();                
			j++;         
			}     
		}      
	return stack.size() == 0;   
	}
 	public static void main(String[] args) {
 		Stack<Integer> stack = new Stack<Integer>();
 		int[] data1 = {1, 2, 3, 4, 5};
 		int[] data2 = {4, 5, 3, 2, 1};
 		int[] data3 = {4, 5, 2, 3, 1};
 		System.out.println(sequenseIsPop(data1, data2));
 		System.out.println(sequenseIsPop(data1, data3));

 	}
 	}
相關文章
相關標籤/搜索