初识单调栈并使用c++代码解决具体问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在解决LeetCode402移掉K位数字时遇到了问题,在仔细查看其他人的题解后了解到了栈的新用法——单调栈。在之前的使用过程中,我对栈的理解就是可以正序输入倒序输出,而如果使用单调栈就可以形成一个单调递增或者递减的数据结构,在解决一些问题的时候会非常轻松。


提示:以下是本篇文章正文内容,下面案例可供参考

一、单调栈是什么?

顾名思义,就是单调递增或者单调递减的栈结构。因为只对栈顶数据进行插入和删除,因此在比较相邻元素的题目中非常有用。

二、使用单调栈解决具体问题

LeetCode402. 移掉K位数字

在这里插入图片描述

思路

将num逐位输入单调栈中,如果栈顶数字比即将输入的大就弹出,直到栈顶是目前最小的数字。这里使用的原理:两个位数相同的数字,第一位不同的数字的大小决定了这两个数字的大小(有点绕,可以自己好好想一想,比如a=15xx,b=16xx,那么b>a)。

c++实现

代码如下:

class Solution {
public:
    string removeKdigits(string num, int k) {
        int amount = num.size() - k;
        string res = "";
        if (num.size() == k)
        {
            res = res + '0';
            return res;
        }
        stack<char> s;
        s.push(num[0]);
        for (int i = 1; i < num.size(); i++)
        {
            if (k == 0) { s.push(num[i]); }
            else
            {
                while ((!s.empty()) && (s.top() > num[i]) && (k > 0))
                {
                    s.pop();
                    k--;
                }
                s.push(num[i]);
            }
        }
        while (s.size() > amount) { s.pop(); }
        for (int i = s.size(); i > 0; i--)
        {
            res = s.top() + res;
            s.pop();
        }
        while (res[0] == '0')
        {
            res = res.substr(1, res.size() - 1);
        }
        if (res.empty()) { res = "0"; }
        return res;
    }
};

总结

以上就是今天要讲的内容,本文仅仅简单介绍了单调栈的使用,单调栈提供了处理一端元素大小比较时一个很好用的工具。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值