后缀表达式(栈)

P1449 后缀表达式

题目描述

所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。

本题中运算符仅包含 +-*/。保证对于 / 运算除数不为 0。特别地,其中 / 运算的结果需要向 0 取整(即与 C++ / 运算的规则一致)。

如:3*(5-2)+7 对应的后缀表达式为:3.5.2.-*7.+@。在该式中,@ 为表达式的结束符号。. 为操作数的结束符号。

输入格式

输入一行一个字符串 s,表示后缀表达式。

输出格式

输出一个整数,表示表达式的值。

输入输出样例 #1

输入 #1

3.5.2.-*7.+@

输出 #1

16

输入输出样例 #2

输入 #2

10.28.30./*7.-@

输出 #2

-7

说明/提示

数据保证,1|s|50,答案和计算过程中的每一个值的绝对值不超过 109

分析

什么是后缀表达式,也叫逆波兰表示法(Reverse Polish Notation, RPN),是一种表达式的写法,其中运算符位于操作数的后面,不使用括号。与普通的中缀表达式(如:3*(5-2)+7)不同,后缀表达式的优点是计算过程不需要考虑运算符的优先级或括号的嵌套,按顺序逐步处理即可。

这里使用数组模拟栈来实现

代码

#include<iostream>
#include<cstring>
#include<string>
using namespace std;

const int N = 200;
long long stk[N], tt = 0;

int main() {
    string s;
    cin >> s;
    int n = s.size();
    int t = 0;
    for(int i = 0;i < n && s[i] != '@';++i)
    {
        if(s[i] >= '0' && s[i] <= '9') t = t * 10 + s[i] - '0';
        if(s[i] == '.') stk[++tt] = t,t = 0;
        if(s[i] == '+') { int a = stk[tt]; --tt;stk[tt] += a; }
        if(s[i] == '-') {int a = stk[tt]; --tt; stk[tt] -= a; }
        if(s[i] == '*') {int a = stk[tt]; --tt; stk[tt] *= a; }
        if(s[i] == '/') {int a = stk[tt]; --tt; stk[tt] /= a; }
        //cout << stk[tt] << endl;
    }
    cout << stk[tt];
    

    
    return 0;
}
posted @   bakul  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示