java 最小栈

本文介绍了一个自定义的数据结构 MinMaxStack,该结构继承自泛型接口 IMinMaxStack,能够实现在栈中快速获取最大值和最小值的功能。通过对栈的内部实现进行特殊设计,确保了这些操作的时间效率。

 

 

 

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/



 
 
 谢谢您的赞助,我会做的更好!

### 设计与实现支持常数时间复杂度操作的最小 #### 最小的设计思路 为了实现在常数时间内完成 `push`、`pop` 和获取当前中的最小值的操作,可以采用两个辅助来解决问题。其中一个用于保存所有的元素(称为主),另一个则用来记录每次压入新元素后的最小值(称为最小)。通过这种方式,在执行任何操作时都可以保持 O(1) 的时间复杂度。 具体来说: - 主负责存储所有被推入的数值。 - 辅助仅存储当前状态下的最小值序列。每当有新的更小或者等于现有最小值的元素加入时,将其也存入辅助;当移除某个元素恰好是最小值时,则同步更新辅助的内容。 这种双方法能够确保无论何时调用getMin()函数都能立即返回新的全局最小值而无需遍历整个列表[^5]。 以下是基于上述原理分别使用Python,C++,Java三种编程语言的具体代码实例: #### Python 实现版本 ```python class MinStack: def __init__(self): self.stack = [] self.min_stack = [] def push(self, x: int) -> None: self.stack.append(x) if not self.min_stack or x <= self.getMin(): self.min_stack.append(x) def pop(self) -> None: if self.stack[-1] == self.getMin(): self.min_stack.pop() self.stack.pop() def top(self) -> int: return self.stack[-1] def getMin(self) -> int: return self.min_stack[-1] ``` #### C++ 实现版本 ```cpp #include <vector> using namespace std; class MinStack { private: vector<int> stack; vector<int> minStack; public: void push(int x){ stack.push_back(x); if(minStack.empty() || x<=minStack.back()) minStack.push_back(x); } void pop(){ if(stack.back()==minStack.back()) minStack.pop_back(); stack.pop_back(); } int top(){ return stack.back(); } int getMin(){ return minStack.back(); } }; ``` #### Java 实现版本 ```java import java.util.Stack; public class MinStack { private Stack<Integer> stack = new Stack<>(); private Stack<Integer> minStack = new Stack<>(); public void push(int x) { stack.add(x); if (minStack.isEmpty() || x <= minStack.peek()) { minStack.add(x); } } public void pop() { if (stack.peek().equals(minStack.peek())) { minStack.pop(); } stack.pop(); } public int top() { return stack.peek(); } public int getMin() { return minStack.peek(); } } ``` 以上各语言版本均实现了基本功能需求,并且保证了各项操作的时间复杂度均为O(1)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值