洛谷P1449题解

洛谷P1449题解

题目信息:

题目链接:https://www.luogu.com.cn/problem/P1449
知识点:栈,字符串

题目简述:

输入后缀运算,给出结果
首先理解后缀运算,比如5+4-2+7(8-2),要把它变成没有括号的,运算符放在两个数之后,计算按运算符出现的顺序,左而右进行的运算,也就变成了5.4.+2.-8.2.-+@
相比于正常运算,输入的数的顺序不会改变,但是每个数后面有.作结束符,算数符号遇到就要进行运算。

题目分析:

例子:5+4-2+7(8-2) -> 5.4.+2.-8.2.-+@
由于括号的存在,先遇到的数不一定先算,如果要先算后面的数,前面的数遇到过要先存起来,这符合后进先出的原则
因此,用栈来储存数据,每次运算弹出栈顶两个数进行运算,把结果放到栈里即可,详见注释

代码


#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
char s[60];
stack<int> stk;
int main() {
    scanf("%s", s);
    int len = strlen(s);
    int n = 0;
    for (int i = 0; i < len; i++) {        //扫字符串
        if (s[i] == '@')break;
        if (s[i] >= '0' && s[i] <= '9'){  //如果是数字跳过,并用n存
            n = (s[i] -'0')+10*n;         //数字可能是多位
            continue;
        }

        if (s[i] == '.') {                //如果遇到.入栈
            stk.push(n);
            n=0;
        }
        else {                        
            int a = stk.top(); stk.pop();
            int b = stk.top(); stk.pop();
            switch (s[i]) {
            case '+':stk.push(a + b); break;
            case '-':stk.push(b - a); break;
            case '*':stk.push(a * b); break;
            case '/':stk.push(b / a); break;
            }
        }
    }
    printf("%d\n", stk.top());
    return  0;
}

最后

屏幕截图 2026-03-12 180147

posted @ 2026-03-12 18:20  沉睡的猫  阅读(13)  评论(0)    收藏  举报