首页 > 代码库 > 洛谷 P1449 后缀表达式 题解
洛谷 P1449 后缀表达式 题解
此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接:https://www.luogu.org/problem/show?pid=1449
题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。
输入输出格式
输入格式:输入:后缀表达式
输出格式:输出:表达式的值
输入输出样例
输入样例#1:
3.5.2.-*7.+@
输出样例#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 }
洛谷 P1449 后缀表达式 题解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。