问题:实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法。要保证这三个方法的时间复杂度都是O(1)。
1.使用 两个栈实现
public class MinStackWithStack {
public static void main(String[] args) {
Student s = new Student();
s.stuAge = 28;
s.stuName ="baoyou";
Student s2 = new Student();
s2.stuAge = 1;
s2.stuName ="baoyuqi";
MinStack<Student> ms = new MinStack();
ms.push(s);
ms.push(s2);
Student min = ms.getMin();
System.out.println(min);
}
}
class MinStack<T extends Comparable<T>>{
Stack<T> stack;
Stack<T> minStack;
public void push(T t){
T obj = null;
if (stack == null) {
stack = new Stack<T>();
minStack = new Stack<T>();
minStack.push(t);
}else{
obj = minStack.peek();
if(t.compareTo(obj) >= 0){
minStack.push(obj);
}else{
minStack.push(t);
}
}
stack.push(t);
}
public T pop(){
if (stack == null || stack.empty()) {
return null;
}
return stack.pop();
}
public T getMin(){
if (minStack == null || minStack.empty()) {
return null;
}
return minStack.peek();
}
}
class Student implements Comparable<Student>{
public String stuName;
public int stuAge;
@Override
public int compareTo(Student s) {
if (this.stuAge < s.stuAge ) {
return -1;
}else if(this.stuAge > s.stuAge ){
return 1;
}
return 0;
}
@Override
public String toString() {
return FastJsonUtils.toJSONString(this).toString();
}
}
2.使用 链表实现 栈
public class MinStackUseNodeDemo {
public static void main(String[] args) {
Student s = new Student();
s.stuAge = 28;
s.stuName = "baoyou";
Student s2 = new Student();
s2.stuAge = 1;
s2.stuName = "baoyuqi";
Student s3 = new Student();
s3.stuAge = 29;
s3.stuName = "baopan";
MinStackUseNode<Student> msun = new MinStackUseNode<Student>();
msun.push(s);
msun.push(s2);
Student min = msun.getMin();
System.out.println(min);
}
}
class MinStackUseNode<T extends Comparable<T>> {
public MinStackElem<T> top;
public <T extends Comparable<T>> void push(T obj) {
if (top == null) {
top = new MinStackElem(obj, obj, null);
} else {
T min = null;
if (obj.compareTo((T) top.min) >= 0) {
min = (T) top.min;
} else {
min = obj;
}
MinStackElem minStackElem = new MinStackElem(obj, min, top);
top = minStackElem;
}
}
public T pop() {
if (top == null) {
return null;
}
T t = top.data;
top = top.next;
return t;
}
public T getMin() {
if (top == null) {
return null;
}
T t = top.min;
return t;
}
}
class MinStackElem<T extends Comparable<T>> {
public T data;
public T min;
public MinStackElem next;
// public MinStackNode(){}
public MinStackElem(T data, T min, MinStackElem next) {
this.data = data;
this.min = min;
this.next = next;
}
}
3.使用数组
public interface IMinMaxStack<T> {
public T pop();
public void push(T t);
public T getMin();
public T getMax();
public int getLength();
}
public class MinMaxStack implements IMinMaxStack<Integer> {
private static int maxLength = 5;
private static int [] data= new int[maxLength];
private static int [] mins= new int[maxLength];
private static int [] maxs= new int[maxLength];
private static int size = 0;
private static int current = 0;
private static int total = 0;
private void growing(){
if (current >= maxLength / 4 * 3 ) {
maxLength = (maxLength *3)/2 + 1;
data = Arrays.copyOf(data, maxLength);
mins = Arrays.copyOf(mins, maxLength);
maxs = Arrays.copyOf(maxs, maxLength);
}
}
@Override
public Integer pop() {
total --;
if (current >= 0) {
int temp = data[current-1] ;
current --;
return temp;
}
return null;
}
@Override
public void push(Integer t) {
total ++;
growing();
data[current] = t;
if(current == 0){
mins[current] = t;
maxs[current] = t;
}else{
if (mins[current-1] >= t) {
mins[current] = t;
}else{
mins[current] = mins[current-1];
}
if (maxs[current-1] <= t) {
maxs[current] = t;
}else{
maxs[current] = maxs[current-1];
}
}
current ++;
}
@Override
public Integer getMin() {
int temp = mins[current];
return temp;
}
@Override
public Integer getMax() {
int temp = maxs[current];
return temp;
}
@Override
public int getLength() {
return total;
}
public static void main(String[] args) {
MinMaxStack ms = new MinMaxStack();
ms.push(6);
ms.push(2);
ms.push(7);
ms.push(1);
ms.push(5);
ms.push(3);
System.out.println("current\tlength\tpop\tmin\tmax");
System.out.println(ms.current+"\t"+ms.getLength()+"\t"+ms.pop()+"\t"+ ms.getMin()+"\t"+ ms.getMax());
System.out.println(ms.current+"\t"+ms.getLength()+"\t"+ms.pop()+"\t"+ ms.getMin()+"\t"+ ms.getMax());
System.out.println(ms.current+"\t"+ms.getLength()+"\t"+ms.pop()+"\t"+ ms.getMin()+"\t"+ ms.getMax());
System.out.println(ms.current+"\t"+ms.getLength()+"\t"+ms.pop()+"\t"+ ms.getMin()+"\t"+ ms.getMax());
System.out.println(ms.current+"\t"+ms.getLength()+"\t"+ms.pop()+"\t"+ ms.getMin()+"\t"+ ms.getMax());
System.out.println(ms.current+"\t"+ms.getLength()+"\t"+ms.pop()+"\t"+ ms.getMin()+"\t"+ ms.getMax());
}
}
捐助开发者
在兴趣的驱动下,写一个
免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(支持支付宝和微信 以及扣扣群),没钱捧个人场,谢谢各位。
个人主页:
http://knight-black-bob.iteye.com/
谢谢您的赞助,我会做的更好!