站外题求助!!

题目总版

Register_int @ 2021-07-06 16:58:41

题目

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,t,f = 1;
bool flag;
stack<int>num;
stack<char>op;
char expr[10010];
int sum[10010];
int lvl(char op){
    if(op == '+' || op == '-') return 1;
    if(op == '*' || op == '/') return 2;
    if(op == '^') return 3;
    return 0;
}
int pow(int x,int y){
    int res = 1;
    for(int i = 1; i <= y; i++) res *= x;
    return res;
}
void calc(){
    int y = num.top();num.pop();
    int x = num.top();num.pop();
    switch(op.top()){
        case '+':num.push(x + y);break;
        case '-':num.push(x - y);break;
        case '*':num.push(x * y);break;
        case '/':num.push(x / y);break;
        case '^':num.push(pow(x,y));break;
    }
    op.pop();
}
int main(){
    scanf("%s",expr + 1);
    n = strlen(expr + 1) - 1;
    for(int i = 1; i <= n; i++){
        sum[i] = sum[i - 1];
        if(expr[i] == '(') sum[i]++;
        if(expr[i] == ')') sum[i]--;
    }
    for(int i = 2; i <= n; i++){
        if(lvl(expr[i]) && lvl(expr[i - 1]) && expr[i] != '-'){
            flag = 1;break;
        }
    }
    if(lvl(expr[n])) flag = 1;
    if((n == 1 && lvl(expr[1])) || sum[n] || flag) return 0 * puts("NO");
    for(int i = 1; i <= n; i++){
        if((i == 1 || !isdigit(expr[i - 1])) && expr[i] == '-'){
            f = -1;continue;
        }
        if(isdigit(expr[i])) t = t * 10 + expr[i] - 48,flag = 1;
        else{
            if(flag) num.push(t * f),t = flag = 0,f = 1;
            if(expr[i] == '('){op.push('(');continue;}
            if(expr[i] == ')'){
                while(op.top() != '(') calc();
                op.pop();
                continue;
            }
            while(!op.empty() && lvl(op.top()) >= lvl(expr[i])) calc();
            op.push(expr[i]);
        }
    }
    if(flag) num.push(t * f);
    while(!op.empty()) calc();
    printf("%d",num.top());
}

80pts代码


by Register_int @ 2021-07-07 09:17:34

哦,没事了。我没括号匹配。


|