设计getMin功能的栈

(一)、题目

实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

(二)、题目描述

在这里插入图片描述

(三)、样例

在这里插入图片描述

(四)、备注

在这里插入图片描述

(五)、程序代码

import java.util.*;
public class Main {
	//创建两个栈。stack1用来存储所有元素,stack2使用栈顶存储最小元素
    Stack<Integer> stack1 ;
    Stack<Integer> stack2 ;
    
   //初始化
    public Main() {
        this.stack1 = new Stack<Integer>();
        this.stack2 = new Stack<Integer>();
    }
    
    //push方法
    public void push(Integer num) {
    	//判断stack2是否为空
        if(!stack2.isEmpty()) {
        	//不为空,则取出stack2的栈顶元素
            Integer temp = stack2.peek();
            //比较stack2的栈顶元素和num的大小
            if(temp >= num) {
            	//如果栈顶元素大于或等于num,则将num压入stack2中
                stack2.push(num);
            }
            //无论上面的if是否成立,都需要压入stack1栈中
            stack1.push(num);
        } else {
        	//如果stack2为空,不用比较,直接两个栈都压入
            stack1.push(num); 
            stack2.push(num);
        }
         
    }
    //返回栈中的最小元素
    public Integer getMin() {
    	//判断stack2栈中是否为空
        if(!stack2.isEmpty()) {
        	//返回stack2的栈顶元素
            return stack2.peek();
        }
        return -1;
    } 
    //弹出栈顶元素
    public void pop() {
    	//判断stack1栈中是否为空
        if(!stack1.isEmpty()) {
        	//弹出stack1中的栈顶元素
            Integer answer = stack1.pop();
            //判断stack2中是否为空
            if(!stack2.isEmpty()) {
            	//获得stack2的栈顶元素
                Integer judge = stack2.peek();
                //如果两者相等,那么也需要弹出stack2的栈顶元素
                if(judge == answer) {
                    stack2.pop();
                }
            }
        }
    }
    
    public static void main(String[] args){
        Main u = new Main();
        Scanner reader = new Scanner(System.in);
        //获得操作的次数
        Integer sum = reader.nextInt();
        Integer[] array = new Integer[sum];
        int len = 0;
        for(int i = 0; i < sum; i++) {
        	//获得输入指令
            String in = reader.next();
            if(in.equals("getMin")) {
            	//获得最小值
                array[len++]  = u.getMin();
            }else if(in.equals("push")) {
            	//添加操作
                u.push(reader.nextInt());
            }else if(in.equals("pop")) {
            	//删除操作
                u.pop();
            }
 
        }
        for(int i = 0; i < len; i++) {
            System.out.println(array[i]);
        }
    }
}

(六)、代码思路

整体思路是用两个栈来进行存储,stack1就存储需要添加的所有元素,stack2的栈顶则始终存放所有元素中的最小元素

  • push方法:这里分为两种情况讨论。一种是stack2为空的情况下,那么新添加的元素肯定是最小元素,所以stack1和stack2中都需要添加元素。另外一种情况是stack2不为空的情况下,那么就需要比较stack2的栈顶元素是否大于或等于新添加的元素,如果是,那就stack1和stack2都要添加新元素。如果不是,那么只需要在stack1中添加即可。
  • getMin方法:因为stack2的栈顶始终存储着最小元素,所以直接返回stack2的栈顶元素即可。
  • pop方法:这里首先要从stack1中弹出栈顶元素,与stack2中的栈顶元素相比较,如果两者相等,那么stack2也需要弹出栈顶元素。
  • 这道代码题所用的时间复杂度为O(n),空间复杂度也为O(n)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值