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));

 	}
 	}
相关文章
相关标签/搜索