首页 > 其他分享 >AcWing 3302. 表达式求值

AcWing 3302. 表达式求值

时间:2023-12-04 11:35:30浏览次数:24  
标签:优先级 top 运算符 num str 求值 AcWing 3302 op

题面:给定一个表达式,其中运算符仅包含加减乘除,可能包含括号,请你求出表达式的最终值。

原题链接:3302. 表达式求值 - AcWing

基本思路

  • 创建两个栈,分别存储数字和运算符
  • 运算符的判定:仅在以下条件满足时将运算符直接压入栈中:
    ①栈中不存在元素 ②当前运算符优先级比栈顶高 ③栈顶为左括号
    其他情况下,取出栈顶优先级较高的运算符,与数字栈顶两元素,先行计算
  • 括号的判定:当遇到右括号时,将括号内表达式优先计算
    为什么此时不需要考虑运算符优先级的问题?因为此时括号内均为同一优先级

两个核心关键点[1]

  1. 双栈:一个操作数栈,一个运算符栈;
  2. 运算符优先级:栈顶运算符,和,即将入栈的运算符的优先级比较。
#include <bits/stdc++.h>
#include <unordered_map>
using namespace std;

string str;
stack<int> num;
stack<char> op;

//也可以写为优先级表
unordered_map<char, int> h{ {'+', 1}, {'-', 1}, {'*',2}, {'/', 2} };
//判断运算符优先级
//int prior(char op) {
//    if (op == '+' || op == '-')
//        return 1;
//    if (op == '*' || op == '/')
//        return 2;
//    return 0;
//}

//弹出栈顶运算符,进行计算
void calculate(stack<int>& num, stack<char>& op, char opr) {
    int top = num.top();
    num.pop();
    int sec = num.top();
    num.pop();
    if (opr == '+') sec += top;
    if (opr == '-') sec -= top;
    if (opr == '*') sec *= top;
    if (opr == '/') sec /= top;
    num.push(sec);
    op.pop();
}

//初始化数字栈,运算符栈中只保留同一优先级的运算符
void init(stack<int>& num, stack<char>& op) {
    //for (size_t i = 0; str[i] != '='; i++) 
    //不需要size_t也能正确计算数字的做法
    for (int i = 0; i < str.size() ; i++) {
        if (isdigit(str[i])) {  //将字符串转换为数字并入数字栈
            double x = 0;
            int j = i;  //保存指针
            while (i < str.size() && isdigit(str[j]))
                x = x * 10 + str[j++] - '0';
            num.push(x);
            i = --j;
        }
        else if (str[i] == '(')
            op.push(str[i]);
        else if (str[i] == ')') {   //优先计算括号中表达式
            while (!op.empty() && op.top() != '(')
                calculate(num, op, op.top());
            op.pop();
        }
        else {
            //待入栈运算符优先级低,则先计算
            while (!op.empty() && h[str[i]] <= h[op.top()])
                calculate(num, op, op.top());
            op.push(str[i]);
        }
    }
}

//此时运算符只有相同优先级,即加减,一次性计算完毕
int finalCal(stack<int>& num, stack<char>& op) {
    while (!op.empty())
        calculate(num, op, op.top());
    return num.top();
}

int main()
{
    cin >> str;
    init(num, op);
    cout << finalCal(num, op);
    return 0;
}

  1. https://www.acwing.com/solution/content/40978/ ↩︎

标签:优先级,top,运算符,num,str,求值,AcWing,3302,op
From: https://www.cnblogs.com/haruhomu/p/17874541.html

相关文章

  • AcWing 154. 滑动窗口
    题面:给定一个大小为\(n≤10^6\)的数组。有一个大小为\(k\)的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到\(k\)个数字。每次滑动窗口向右移动一个位置。你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。原题链接:154.滑动窗口-AcWing......
  • AcWing 785. 快速排序
    题面:给定你一个长度为\(n\)的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。原题链接:785.快速排序-AcWing需要注意的几个点:左右哨兵的发动顺序;相同元素的相对位置;边界划分问题[1]。#include<bits/stdc++.h>usingna......
  • AcWing 4. 多重背包问题
    题面:有\(N\)件物品和一个容量是\(V\)的背包。第\(i\)件物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的体积总和不超过背包容量,且价值总和最大。输出最大价值。原题链接:4.多重背包问题I-AcWing多重背包实际上沿......
  • AcWing 5. 多重背包问题 II
    题面:有\(N\)件物品和一个容量是\(V\)的背包。第\(i\)件物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的体积总和不超过背包容量,且价值总和最大。输出最大价值。原题链接:5.多重背包问题II-AcWing先前的思路[1]:将......
  • AcWing 3. 完全背包问题
    题面:有\(N\)种物品和一个容量是\(V\)的背包,每种物品都有无限件可用。第\(i\)种物品的体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原题链接:3.完全背包问题-AcWing根据01背包的思路扩......
  • AcWing 2. 01背包问题
    题面:有 \(N\) 件物品和一个容量是 \(V\) 的背包。每件物品只能使用一次。第 \(i\) 件物品的体积是 \(v_i\),价值是 \(w_i\)。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原链接:2.01背包问题-AcWing有限集的最优问......
  • Acwing第132场周赛
    AcWing5366.大小写转换#include<bits/stdc++.h>#definelsp<<1#definersp<<1|1#definePIIpair<int,int>#definelllonglong#definedbdouble#defineullunsignedlonglong#defineendl'\n'#defineioios::sync_with_......
  • 前缀和/差分——acwing算法基础课笔记
    个人笔记,欢迎补充,指正。一维前缀和对于数组:a[1],a[2],a[3]...a[n];其前缀和数组为s[i]=a[1]+a[2]+...+a[i];下标必须从1开始求前缀和1for(inti=1;i<n;++i)2s[i]=s[i-1]+a[i];s[0]需要定义为0作用求原数组里一段数(l,r)的和......
  • Acwing.第132场周赛
    Acwing.第132场周赛比赛地址A.大小写转换题目思路:简单的模拟,可以使用c++大小写转换库函数,但是由于我早上比赛时候没用好就不敢用了就用了ASCII码转换代码:#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ strings; cin>>s; for(inti=0;i<s.size();i++)......
  • 【AcWing-Linux】03. Shell
    Shell一、Shell简介shell是我们通过命令行与操作系统沟通的语言。shell是一种脚本语言,通过对应的脚本解释器解释执行,一般作为内置于操作系统的应用程序向用户提供访问操作系统内核的服务。shell脚本(shellscript)可以直接在命令行中执行,也可以将一套逻辑组织成一个文件,方便复......