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

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

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来得到正序字符串

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

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


目录
相关文章
|
1月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
28天前
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
33 0
|
2月前
|
算法
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
这篇文章介绍了动态规划算法中解决最大上升子序列问题(LIS)的方法,包括问题的描述、动态规划的步骤、状态表示、递推方程、计算最优值以及优化方法,如非动态规划的二分法。
78 0
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
|
2月前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
2月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
2月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
2月前
|
机器学习/深度学习 算法
机器学习入门:梯度下降算法(上)
机器学习入门:梯度下降算法(上)
|
12天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
18天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。
|
6天前
|
存储 算法
基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真
本项目基于HMM模型实现金融数据预测,包括模型训练与预测两部分。在MATLAB2022A上运行,通过计算状态转移和观测概率预测未来值,并绘制了预测值、真实值及预测误差的对比图。HMM模型适用于金融市场的时间序列分析,能够有效捕捉隐藏状态及其转换规律,为金融预测提供有力工具。