Java学习手册:(数据结构与算法-栈与队列)如何用O(1)的时间复杂度求栈中最小的元素?

算法思想:应用文章方法一中用数组方式实现的栈(本代码没有采用Java内置栈方法),通过空间换取时间的方式来提高时间复杂度,也就是说采用额外的存储空间来降低操作的时间复杂度。具体来说就是使用两个栈,一个栈用来存储数据,另一个栈用来存储栈中的最小元素。

代码如下:

package com.haobi;

public class MyStack1 {
	MyStack<Integer> elem;
	MyStack<Integer> min;
	public MyStack1() {
		elem = new MyStack<Integer>();//存储数据
		min = new MyStack<Integer>();//存储最小元素
	}
	public void push(int data) {
		elem.push(data);
		if(min.isEmpty())
			min.push(data);
		else {
			if(data<min.peek())
				min.push(data);
		}
	}
	public int pop() {
		int topData = elem.peek();
		elem.pop();
		if(topData == this.min())
			min.pop();
		return topData;
	}
	public int min() {
		if(min.isEmpty())
			return Integer.MAX_VALUE;
		else//如果存储最小值的栈不为空,则输出栈顶元素
			return min.peek();
	}
	public static void main(String[] args) {
		MyStack1 s = new MyStack1();
		s.push(2);//进栈
		s.push(1);//进栈
		s.push(3);//进栈
		System.out.println("栈内最小的元素为:"+s.min());
	}
}

程序输出结果如下:

栈内最小的元素为:1
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值