首页 > 其他分享 >(11/60)有效的括号、删除字符串中所有相邻重复项、逆波兰表达式求值

(11/60)有效的括号、删除字符串中所有相邻重复项、逆波兰表达式求值

时间:2024-02-05 23:44:20浏览次数:30  
标签:11 入栈 复杂度 st 60 括号 push 求值 else

有效的括号

leetcode:20. 有效的括号

实现

思路

遍历到左括号,入栈对应的右括号(方便遍历到右括号时进行对比);遍历到右括号,对比栈顶元素。

把无效三种情况照顾到:1. 左括号多了(遍历结束后栈不为空);2. 左右括号不匹配(右括号时栈顶元素与当前元素对比);3. 右括号多了(右括号时栈是空的)。

复杂度分析

时间复杂度: O(n)
空间复杂度: O(n)

注意点

  1. 要先写调用.top前要避免栈是空的!(所以利用短路效应,条件先写的.empty(),防止.top空栈)

代码实现

class Solution {
public:
    bool isValid(string s) {
        // 左括号多了、括号不匹配、右括号多了
        stack<char> st;
        // 如果是奇数长度,一定无效(剪枝)
        if(s.size() % 2 == 1)
            return false;
        for(int i = 0;i < s.size();i++){
            // 左括号入栈
            if(s[i] == '(') st.push(')');
            else if(s[i] == '[') st.push(']');
            else if(s[i] == '{') st.push('}');
            // 2、3情况
            else if(st.empty() || s[i] != st.top()) return false;
            else{   // 否则弹出栈顶
                st.pop();
            }
        }
        // 1情况,如果结束遍历后st为空则有效,否则左括号有多余
        return st.empty();
    }
};

删除字符串中所有相邻重复项

leetcode:047. 删除字符串中的所有相邻重复项

用栈

思路

遍历字符串,栈顶元素与当前元素相同 ? 删除当前元素,上一元素出栈 : 当前元素入栈,继续遍历

复杂度分析

时间复杂度:O(N)。

空间复杂度:O(N)。最坏情况字符串全部入栈。

注意点

代码实现

class Solution {
public:
    string removeDuplicates(string s) {
        // 对比栈顶元素与当前元素是否相同
        // 相同则删除当前元素与上一元素
        // 不相同则下一元素入栈后移遍历
        stack<char> st;
        for(int i = 0;i < s.size();i++){
            // 栈非空且当前元素等于栈顶元素
            if(!st.empty() && s[i] == st.top()){
                st.pop();
            }else{
                st.push(s[i]);
            }
        }
        string result = "";
        while(!st.empty()){
            result += st.top();
            st.pop();
        }  
        reverse(result.begin(),result.end());
        return result;
    }
};

逆波兰表达式求值

leetcode:150. 逆波兰表达式求值

思路

逆波兰表达式就是后缀表达式(先数字再符号)。

本质就是不停地进行两个数字的符号运算。

思路就是遇到数字入栈,遇到符号出栈两个数字做运算,结果重新入栈。

复杂度分析

时间复杂度:O(N)。

空间复杂度:O(N)。最差情况下全部入栈。

注意点

  1. 注意,vector的元素是string不是char。
  2. 后缀表达式不需要加括号表示优先级(和中缀相比的优势)。

代码实现

    class Solution {
    public:
        int evalRPN(vector<string>& tokens) {
            // 遇到数字入栈,遇到符号出栈做运算,结果入栈
            stack<long long> st;
            for(string s : tokens){
                if(s == "+" || s == "-" || s == "*" || s == "/"){
                    long long num1 = st.top(); st.pop();
                    long long num2 = st.top(); st.pop();
                    if(s == "+") st.push(num2 + num1);
                    else if(s == "-") st.push(num2 - num1);
                    else if(s == "*") st.push(num2 * num1);
                    else if(s == "/") st.push(num2 / num1);
                    
                }else{
                    st.push(stoll(s));	// string to long long
                }
            }

        int result = st.top();
        st.pop();
        return result;
        }
    };

标签:11,入栈,复杂度,st,60,括号,push,求值,else
From: https://www.cnblogs.com/tazdingo/p/18009022

相关文章

  • 【2024潇湘夜雨】WIN11_Pro_23H2.22635.3139软件选装纯净版2.04
    【系统简介】=============================================================1.本次更新母盘来自WIN11_Pro_23H2.22635.3139.2.增加部分优化方案,手工精简部分较多。3.OS版本号为22635.3139。精简系统只是为部分用户安装,个别要求高的去MSDN下。4.集成《DrvCeo-2.16.0.0》网卡版、运......
  • Proxmox 7.4 使用vgpu_unlock,为GTX1060开启vGPU支持
    本文在2021年发布的博客《Proxmox5.4使用vgpu_unlock,为GTX1060开启vGPU支持》,介绍了ProxmoxVE5.4上部署vGPUunlock的操作步骤。 后续有发布了在 ProxmoxVE7.x上支持vGPU的博客《Proxmox7.2部署DoraCloud桌面云,支持vGPU》,实现了通过3个脚本完成vGPU的配置。 ......
  • P1114 “非常男女”计划
    原题链接这道题是前缀和的简单应用。我们可以将男生看为1,女生看为-1。那么题目要求的最长子数组的判断条件为该数组和是否为0。首先我们对整个数组进行前缀和;接下来假定该最长子数组在right位置(right进行遍历)结束,那么就有两种情况讨论:1、该位置前缀和为0,那么与max进行比较。......
  • ORA-600[kqlnrc_1]
    ORA-600[kqlnrc_1]目录ORA-600[kqlnrc_1]1.现象2.处理1.现象oracle后台日志alert.log,报错Errorsinfile/oracle/diag/rdbms/airxxxx/airxxxx1/trace/airxxxx1_ora_152214.trc(incident=32162):ORA-00600:�ڲ���������,����:[kqlnrc_1],[0x50AA46990],[],[],[],[],[],[],......
  • 2024/2/5~2024/2/11
    小红数组操作题目链接:https://ac.nowcoder.com/acm/contest/74362/D题目描述小红拿到了一个数组,初始数组为空,她希望你实现以下两种操作:1.输入1\(x\)\(y\),将\(x\)插入在元素\(y\)的右边。保证此时数组中没有元素等于\(x\),且数组中存在一个\(y\)。特殊的,如果将\(......
  • DPDK-22.11.2 [六] RSS receive side scaling 网卡分流机制
    这个的作用就是为了提高性能。当分析网络数据时,可以为网口提供多个接收队列,每个cpu处理一个队列。如果每条队列是独立的,那么就可以很好的并发。这里有两个问题,一个是数据需要平均的分配到每个队列;二是同一组数据需要分配到同一个队列。rss就是这个作用,可以设定以ip进行区分,或......
  • P1122 最大子树和
    原题链接前记我觉得这道题用树形dp解释不太妥当思路当一道题无法用直观的模拟来实现的时候,我们要换个思路1.对于一个有\(N\)个节点,\(N-1\)条边的图,我们可以将其变为随便抓取一个节点为根节点的树的问题2.就此我们发现一个事实,对于任意树而言,其答案最大值一定是某个节......
  • 概率论中的60个概念和定理
    概念:1.概率(Probability):描述事件发生的可能性大小的数值。通常用�(�)P(A)表示事件�A的概率,取值范围在0到1之间。2.随机变量(RandomVariable):描述随机试验结果的数学对象。随机变量可以是离散型的(取值有限或可数无限)或连续型的(取值为某个区间)。3.概率分布(Probabilit......
  • c++11的左值 右值的笔记
    在C++11的程序中,所有的值必须属于左值,将亡值,纯右值之一。将忘值则是c++11新增的跟右值引用相关的表达式,这样表达式通常是将要被移动的对象(以为他用),比如返回右值引用T&&的函数返回值,std::move的返回值,或者转换为T&&的类型的转换函数的返回值。而剩余的,可以标识函数、对象的值都属......
  • [解决办法]笔记本win11 win10系统亮度自动降低 关闭自动对比度自动亮度自适应
    https://www.bilibili.com/video/BV18K411k7AJ解决办法整理:控制面板:控制面板\所有控制面板项\电源选项\编辑计划设置这里的显示里面有的电脑有自动降低亮度相关设置英特尔显卡管理面板-功率菜单,节能功能关闭。(微软商店可以装这个软件)首先,他节约不少多少点能服务-......