【算法入门】 有效括号序列|逆波兰表达式求值|点击消除(下)

简介: 【算法入门】 有效括号序列|逆波兰表达式求值|点击消除

2、AB4 逆波兰表达式求值

题目链接:逆波兰表达式求值


题目描述:


fe95acfd037443afba58b704b507d38c.png


2.1、解题思路

所谓逆波兰表达式就是:操作数在前,操作符在后, 2 - 1 相当于2 1 -,采用辅助栈:


遍历字符串,如果对应的字符不等于四则运算符,将操作数入栈

如果字符为四则运算符,取栈顶后出栈再取栈顶,根据运算符将不同运算结果入栈

遍历结束后的栈顶元素就是逆波兰表达式最终结果

2.2、代码实现与解析

本题源码:

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串vector
     * @return int整型
     */
    int evalRPN(vector<string>& s) {
        stack<int> stk;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == "+" || s[i] == "-" || s[i] == "*" || s[i] == "/") {
                int x1 = stk.top();
                stk.pop();
                int x2 = stk.top();
                stk.pop();
                if (s[i] == "+") stk.push(x1 + x2);
                if (s[i] == "-") stk.push(x2 - x1);
                if (s[i] == "*") stk.push(x1 * x2);
                if (s[i] == "/") stk.push(x2 / x1);
            } else {
                stk.push(stoi(s[i]));
            }
        }
        return stk.top();
    }
};

重要注释:


非四则运算符的话将字符串转化为整型后入栈,stoi可用于将字符型转化为整型

取栈顶后需要出栈一次才能再次取栈顶,这样才是两个连续的操作数

进行减法和除法时要让第二个栈顶在前,记住栈先进后出的特点

3、AB5 点击消除

题目链接:点击消除


题目描述:


b2d4d396f48f421587798bfce180f16a.png


3.1、解题思路

简单来说就是将相邻且相同的字符消除,采用辅助栈即可:


辅助栈空时直接入栈

后续遍历时若栈顶元素与之相等就出栈,不等就入栈

判断最终栈的情况:

若栈空,输出0

若栈不空,输出栈内字符串

3.2、代码实现与解析

本题源码:

#include <iostream>
#include <stack>
using namespace std;
int main() {
    string s, res;
    cin >> s;
    stack<char>stk;
    for (int i = 0; i < s.size(); i++) {
        if (!stk.empty() && stk.top() == s[i]) {
            stk.pop();
        } else {
            stk.push(s[i]);
        }
    }
    if (stk.empty()) cout << 0;
    else {
        while (!stk.empty()) {
            res = stk.top() + res;
            stk.pop();
        }
        cout << res;
    }
}

重要注释:


此题是自己设计输入输出,使用辅助栈需要包含头文件:<stack>

由于栈是先进后出,因此采用字符串拼接:res = stk.top() + res来得到正序字符串

核心点在于入栈和出栈的条件,这点掌握就没问题了

欢迎大家订阅专栏,学习算法思想,合理利用牛客网,百炼成神!


目录
相关文章
|
3月前
|
存储 算法
算法入门:专题二---滑动窗口(长度最小的子数组)类型题目攻克!
给定一个正整数数组和目标值target,找出总和大于等于target的最短连续子数组长度。利用滑动窗口(双指针)优化,维护窗口内元素和,通过单调性避免重复枚举,时间复杂度O(n)。当窗口和满足条件时收缩左边界,更新最小长度,最终返回结果。
|
3月前
|
存储 算法
算法入门:专题一:双指针(有效三角形的个数)
给定一个数组,找出能组成三角形的三元组个数。利用“两边之和大于第三边”的性质,先排序,再用双指针优化。固定最大边,左右指针从区间两端向内移动,若两短边之和大于最长边,则中间所有组合均有效,时间复杂度由暴力的O(n³)降至O(n²)。
|
3月前
|
存储 算法 编译器
算法入门:剑指offer改编题目:查找总价格为目标值的两个商品
给定递增数组和目标值target,找出两数之和等于target的两个数字。利用双指针法,left从头、right从尾向中间逼近,根据和与target的大小关系调整指针,时间复杂度O(n),空间复杂度O(1)。找不到时返回{-1,-1}。
|
4月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于WOA鲸鱼优化的XGBoost序列预测算法matlab仿真
基于WOA优化XGBoost的序列预测算法,利用鲸鱼优化算法自动寻优超参数,提升预测精度。结合MATLAB实现,适用于金融、气象等领域,具有较强非线性拟合能力,实验结果表明该方法显著优于传统模型。(238字)
|
7月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于MATLAB2022a/2024b开发,结合粒子群优化(PSO)算法与双向长短期记忆网络(BiLSTM),用于优化序列预测任务中的模型参数。核心代码包含详细中文注释及操作视频,涵盖遗传算法优化过程、BiLSTM网络构建、训练及预测分析。通过PSO优化BiLSTM的超参数(如学习率、隐藏层神经元数等),显著提升模型捕捉长期依赖关系和上下文信息的能力,适用于气象、交通流量等场景。附有运行效果图预览,展示适应度值、RMSE变化及预测结果对比,验证方法有效性。
|
6月前
|
机器学习/深度学习 数据采集 算法
你天天听“数据挖掘”,可它到底在“挖”啥?——数据挖掘算法入门扫盲篇
你天天听“数据挖掘”,可它到底在“挖”啥?——数据挖掘算法入门扫盲篇
135 0
|
3月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
322 0
|
3月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
227 2
|
4月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
240 3
|
3月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
195 8