算法竞赛备考冲刺必刷题(C++) | 洛谷 P1449 后缀表达式

本文分享的必刷题目是从蓝桥云课洛谷AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。

欢迎大家订阅我的专栏:算法题解:C++与Python实现!

附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总


【题目来源】

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

【题目描述】

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

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

【输入】

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

【输出】

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

【输入样例】

3.5.2.-*7.+@

【输出样例】

16

【算法标签】

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

【代码详解】

#include 
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

你可能感兴趣的:(算法,c++,开发语言)