此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接:https://www.luogu.org/problem/show?pid=1449
题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.[email protected]。’@’为表达式的结束符号。‘.’为操作数的结束符号。
输入输出格式
输入格式:
输入:后缀表达式
输出格式:
输出:表达式的值
输入输出样例
输入样例#1:
3.5.2.-*[email protected]
输出样例#1:
16
说明
字符串长度,1000内。
分析:
后缀表达式求法:
从左往右扫描表达式,遇到数字则入栈,遇到运算符则弹出栈顶的两个数进行运算(如果是减法/除法,要用后出栈的减去/除以先出栈的),再把运算结果入栈。
这样求完之后栈内的元素就是表达式的运算结果。
AC代码:
1 #include<iostream> 2 #include<cmath> 3 #include<algorithm> 4 #include<cstdio> 5 #include<cstring> 6 #include<stack> 7 8 char line[1005]; 9 std::stack <int> s; 10 11 int main() 12 { 13 scanf("%s",line); 14 int len = strlen(line)-1; 15 //-1是为了忽略结尾的@,这种读取方式不需要使用@中止 16 int a,b,tmp = 0; 17 for(int i = 0;i <= len;++ i) 18 { 19 if(line[i] >= ‘0‘ && line[i] <= ‘9‘) 20 { 21 tmp = tmp*10+line[i]-‘0‘; 22 continue; 23 } 24 if(tmp) 25 s.push(tmp); 26 tmp = 0; 27 if(line[i] == ‘.‘) 28 continue; 29 else if(line[i] == ‘+‘) 30 { 31 a = s.top();s.pop(); 32 b = s.top();s.pop(); 33 s.push(a+b); 34 } 35 else if(line[i] == ‘-‘) 36 { 37 a = s.top();s.pop(); 38 b = s.top();s.pop(); 39 s.push(b-a); 40 } 41 else if(line[i] == ‘*‘) 42 { 43 a = s.top();s.pop(); 44 b = s.top();s.pop(); 45 s.push(a*b); 46 } 47 else if(line[i] == ‘/‘) 48 { 49 a = s.top();s.pop(); 50 b = s.top();s.pop(); 51 s.push(b/a); 52 } 53 } 54 int ans = s.top(); 55 printf("%d\n",ans); 56 return 0; 57 }
时间: 2024-10-20 02:46:15