最新文章

这里会显示最新的几篇文章摘要。

后缀表达式(栈)

P1449 后缀表达式

题目描述

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

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

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

输入格式

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

输出格式

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

输入输出样例 #1

输入 #1

3.5.2.-*7.+@

输出 #1

16

输入输出样例 #2

输入 #2

10.28.30./*7.-@

输出 #2

-7

说明/提示

数据保证,\(1 \leq |s| \leq 50\),答案和计算过程中的每一个值的绝对值不超过 \(10^9\)

分析

什么是后缀表达式,也叫逆波兰表示法(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 @ 2025-02-26 18:59  bakul  阅读(37)  评论(0)    收藏  举报