您的位置:首页 > Web前端

剑指offer18--旋转的方式打印矩阵

2016-05-28 16:57 399 查看


题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小素的min 函数。在该栈中,调用min、push 及pop的时间复杂度都是0(1)

我那解题思路一开始就是错的,这个题目的思路就是要自己重新定义一个栈,而我是利用栈来进行操作,好失败。
下面还是大神的代码,不能这样,一定要多花时间自己编出来才可以。
package 剑指offer;
import java.util.*;

public class Test21 {
public static void main(String args[]){
StackIncludeMin<Integer> stack = new StackIncludeMin<>();
stack.push(3);
System.out.println(stack.min() == 3);
stack.push(4);
System.out.println(stack.min() == 3);
stack.push(2);
System.out.println(stack.min() == 2);
stack.push(3);
System.out.println(stack.min() == 2);
stack.pop();
System.out.println(stack.min() == 2);
stack.pop();
System.out.println(stack.min() == 3);
stack.push(0);
System.out.println(stack.min() == 0);
}

public static class StackIncludeMin<T extends Comparable<T>>{
// 注意在minstack中存的是最小元素的位置
private Stack<T> dataStack;
private Stack<Integer> minStack;

public StackIncludeMin(){
this.dataStack = new Stack<>();
this.minStack = new Stack<>();
}

public T pop(){
if(dataStack.isEmpty()){
throw new RuntimeException("Stack is Empty");
}

minStack.pop();
return dataStack.pop();
}

public void push(T t) {
if (t == null) {
throw new RuntimeException("Element can be null");
}

if (dataStack.isEmpty()) {
dataStack.push(t);
minStack.push(0);
}

else {
// 获取数据栈中的最小元素(未插入t之前的)
T e = dataStack.get(minStack.peek());
// 将t入栈
dataStack.push(t);
// 如果插入的数据比栈中的最小元素小
if (t.compareTo(e) < 0) {
// 将新的最小元素的位置入最小栈
minStack.push(dataStack.size() - 1);
} else {
// 插入的元素不比原来的最小元素小,复制最小栈栈顶元素,将其入栈
minStack.push(minStack.peek());
}
}
}

public T min() {
// 如果最小数公位置栈已经为空(数据栈中已经没有数据了),则抛出异常
if (minStack.isEmpty()) {
throw new RuntimeException("No element in stack.");
}

// 获取数据栈中的最小元素,并且返回结果
return dataStack.get(minStack.peek());
}
}
}

好好应对,不能应付,不能浮躁
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 剑指offer