题解:洛谷 P1449 后缀表达式
【题目来源】
【题目描述】
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:\(3*(5-2)+7\) 对应的后缀表达式为:\(3.5.2.-*7.+@\)。在该式中,@ 为表达式的结束符号。. 为操作数的结束符号。
【输入】
输入一行一个字符串 \(s\),表示后缀表达式。
【输出】
输出一个整数,表示表达式的值。
【输入样例】
3.5.2.-*7.+@
【输出样例】
16
【解题思路】

【算法标签】
《洛谷 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
浙公网安备 33010602011771号