设计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
    评论
好的,以下是用C++实现的MinStack类,支持push、pop和getmin操作: ```cpp #include <iostream> #include <stack> using namespace std; class MinStack { public: void push(int x) { s1.push(x); if (s2.empty() || x <= s2.top()) { s2.push(x); } } void pop() { if (s1.top() == s2.top()) { s2.pop(); } s1.pop(); } int getmin() { return s2.top(); } private: stack<int> s1; // 存储元素 stack<int> s2; // 存储当前最小元素 }; ``` 在push操作中,如果当前元素小于等于最小元素顶元素,则将该元素也插入最小元素中。在pop操作中,如果弹出的元素是最小元素,则同步弹出最小元素中的顶元素。在getmin操作中,直接返回最小元素顶元素即可。 接下来是完整的程序代码,可以用于输入输出和测试: ```cpp #include <iostream> #include <stack> using namespace std; class MinStack { public: void push(int x) { s1.push(x); if (s2.empty() || x <= s2.top()) { s2.push(x); } } void pop() { if (s1.top() == s2.top()) { s2.pop(); } s1.pop(); } int getmin() { return s2.top(); } private: stack<int> s1; // 存储元素 stack<int> s2; // 存储当前最小元素 }; int main() { int n; cin >> n; MinStack s; while (n--) { string op; cin >> op; if (op == "push") { int x; cin >> x; s.push(x); } else if (op == "pop") { s.pop(); } else if (op == "getmin") { cout << s.getmin() << endl; } } return 0; } ``` 输入格式如下: ``` 6 push 3 push 2 push 5 getmin pop getmin ``` 输出格式如下: ``` 2 3 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值