题解:洛谷 P1449 后缀表达式

【题目来源】

洛谷:P1449 后缀表达式 - 洛谷

【题目描述】

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

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

【输入】

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

【输出】

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

【输入样例】

3.5.2.-*7.+@

【输出样例】

16

【解题思路】

image

【算法标签】

《洛谷 P1449 后缀表达式》 #模拟# #字符串# #线性数据结构# #栈#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

const int N = 255 + 10;  // 定义栈的最大容量

int s[N];                // 栈数组,用于存储操作数
string str;              // 存储输入的后缀表达式
int top = 0;             // 栈顶指针,初始为0

// 执行运算操作
void eval(char c)
{
    int b = s[top--];  // 弹出栈顶元素作为第二个操作数
    int a = s[top--];  // 弹出栈顶元素作为第一个操作数
    
    // 根据运算符执行相应计算
    switch(c) 
    {
        case '+': 
            s[++top] = a + b;  // 加法运算
            break;
        case '-':
            s[++top] = a - b;  // 减法运算
            break;
        case '*':
            s[++top] = a * b;  // 乘法运算
            break;
        case '/':
            s[++top] = a / b;  // 除法运算
            break;
    }
}

int main()
{
    // 读取输入的后缀表达式(带空格)
    getline(cin, str);
    
    // 遍历表达式中的每个字符
    for (int i = 0; i < str.size() - 1; i++) 
    {
        // 处理数字字符
        if (str[i] >= '0' && str[i] <= '9') 
        {
            int d = 0, j = i;
            // 将连续的数字字符转换为整数
            while (str[j] != '.') 
            {
                d = d * 10 + (str[j] - '0');
                j++;
            }
            i = j;  // 跳过已处理的数字字符
            s[++top] = d;  // 将数字压入栈中
        }
        // 处理运算符(忽略空格)
        else if (str[i] != ' ') 
        {
            eval(str[i]);  // 执行运算
        }
    }
    
    // 输出最终的计算结果(栈顶元素)
    cout << s[top] << endl;
    
    return 0;
}

【运行结果】

3.5.2.-*7.+@
16
posted @ 2026-02-17 19:44  团爸讲算法  阅读(2)  评论(0)    收藏  举报