190423打卡:设计一个具有getMin功能的栈

题目描述:
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返
回栈中最小元素的操作。
【要求】
1.pop、push、getMin操作的时间复杂度都是O(1)。
2.设计的栈类型可以使用现成的栈结构。
思路:有两种方式的实现,都需要准备两个栈,一个stackData,一个stackMin,
第一种方式是:

在进行压栈操作时,如果栈为空,则分别将这个元素压入到这两个栈中,在以后进行压栈的操作中,比较该元素和stackMin栈的栈顶,如果小于或者等于该栈的栈顶,则将该元素分别压入stackMin栈和stackData栈中,如果大于该栈的栈顶,则只压入stackData栈中,总的来说就是保证stackMin栈的栈顶元素永远是所有元素的最小值。
在进行出栈操作时,都从stackData栈中弹出元素,如果该栈弹出的元素和stackMin栈的栈顶元素相等,则stackMin栈也弹出元素,如果不相等,那么只从stackData栈中弹出元素
在这里插入图片描述
第二种方式:
与第一种方式的总体思路是一样的,都是保证stackMin栈的栈顶元素为所有元素中的最小值,在压栈和出栈的过程中有所不同,
在进行压栈时,比较该元素和stackMin栈的栈顶,如果小于或者等于该栈的栈顶,则将该元素分别压入stackMin栈和stackData栈中,如果大于该栈的栈顶,则将该元素压入stackData栈中,将stackMin栈此时的栈顶元素压入到stackMin栈中,
出栈时,两个栈同时出栈
在这里插入图片描述

import java.util.Stack;

public class Code_004_GetMinStack {
	
	public static class GetMinStack1 {
		private Stack<Integer> stackData;
		private Stack<Integer> stackMin;
		
		public GetMinStack1() {
			stackData =new Stack<>();
			stackMin = new Stack<>();
		}
		
		public void push(int obj) {
			if (stackMin.isEmpty()) {
				stackMin.push(obj);
			} else if (obj <= stackMin.peek()) {
				stackMin.push(obj);
			}
			
			stackData.push(obj);
		}
		
		public int pop() {
			if (stackData.isEmpty()) {
				throw new RuntimeException("Stack is empty");
			} else if (stackData.peek() == stackMin.peek()) {
				stackMin.pop();
			}
			
			return stackData.pop();
		}
		
		public int getMin() {
			if (this.stackMin.isEmpty()) {
				throw new RuntimeException("Stack is empty.");
			}
			return stackMin.peek();
		}
		
	}
	
	public static class GetMinStack2 {
		private Stack<Integer> stackData;
		private Stack<Integer> stackMin;
		
		public GetMinStack2() {
			stackData = new Stack<>();
			stackMin = new Stack<>();
		}
		
		public void push(int obj) {
			if (stackMin.isEmpty()) {
				stackMin.push(obj);
			} else if (obj <= stackMin.peek()) {
				stackMin.push(obj);
			} else {
				stackMin.push(stackMin.peek());
			}
			
			stackData.push(obj);
		}
		
		public int pop() {
			if (stackData.isEmpty()) {
				throw new RuntimeException("Stack is empty");
			}
			stackMin.pop();
			return stackData.pop();
		}
		
		public int getMin() {
			if (this.stackMin.isEmpty()) {
				throw new RuntimeException("Stack is empty.");
			}
			return stackMin.peek();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值