欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

【HDU - 1237】简单计算器 (栈模拟)

发布时间:2023/12/10 51 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【HDU - 1237】简单计算器 (栈模拟) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题干:

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 

Input

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。 

Output

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。 

Sample Input

1 + 2 4 + 2 * 5 - 7 / 11 0

Sample Output

3.00 13.36

解题报告:

栈的应用,因为运算有优先级,在刚开始考虑乘法和除法,如果运算符是加法,则直接把那个数字压入栈里,如果是减法,则把那个数的相反数压入栈里,如果是乘法,则取栈头的数相乘,pop出后把结果push进去。

AC代码:

#include<bits/stdc++.h>using namespace std; char s[205]; int main() {while(1) {gets(s);if(s[0] == '0' && strlen(s) == 1) break;stack<double > sk;int tmp = 0,flag=1;for(int i = 0; i<strlen(s); i++) {if(s[i] == ' ') continue;else if(s[i] == '+') flag=1;else if(s[i] == '-') flag=2;else if(s[i] == '*') flag=3;else if(s[i] == '/') flag=4;else {tmp = 0;while(s[i]>='0' && s[i] <= '9') {tmp = tmp*10 + (s[i] - '0');i++;}i--;switch(flag) {case 1 : sk.push(tmp);break;case 2 : sk.push(-tmp);break;case 3 : {double x = sk.top() * tmp;sk.pop();sk.push(x);tmp=0;break;}case 4 : {double x = sk.top() / tmp;sk.pop();sk.push(x);tmp=0;break;}}}}double ans=0;while(!sk.empty()) {ans += sk.top();sk.pop();}printf("%.2f\n",ans);}return 0 ; }

AC代码2:(在https://leetcode-cn.com/problems/basic-calculator-ii/提交)

class Solution { public:int calculate(string s) {stack<int> sk;int sign = 1;for(int i = 0; i<s.length(); i++) {if(s[i] == ' ') continue;else if(s[i] == '+') sign = 1;else if(s[i] == '-') sign = 2;else if(s[i] == '*') sign = 3;else if(s[i] == '/') sign = 4;else {int tmp = 0;while(i < s.length() && s[i]>='0'&&s[i]<='9') {tmp = tmp * 10 + (s[i] - '0');i++;}i--;if(sign == 1) sk.push(tmp);if(sign == 2) sk.push(-tmp);if(sign == 3) {int x = sk.top();sk.pop();sk.push(x*tmp);}if(sign == 4) {int x = sk.top();sk.pop();printf("%d %d",x,tmp);sk.push(x/tmp);}}}int ans = 0;while(sk.size()) {ans += sk.top();sk.pop();}return ans;} };

错误代码:

#include<bits/stdc++.h>using namespace std; char s[10000]; int main() {while(1) {gets(s);if(s[0] == '0') break;stack<double > sk;int tmp = 0;for(int i = 0; i<strlen(s); i++) {if(s[i] == ' ') continue;else if(s[i] == '+') sk.push((double)tmp),tmp=0;else if(s[i] == '-') sk.push((double)-tmp),tmp=0;else if(s[i] == '*') {double x = sk.top() * tmp;sk.pop();sk.push(x);tmp=0;}else if(s[i] == '/') {double x = sk.top() / tmp;sk.pop();sk.push(x);tmp=0;}else {tmp = tmp*10 + (s[i] - '0');}}double ans=0;while(!sk.empty()) {ans += sk.top();sk.pop();}printf("%.2f\n",ans);}return 0 ; }

总结:

   这个错误代码都不知道是什么一个思路,所以做这种题,每一步实现的功能需要很明确,比如我如果要读入数,那就一次性都读完,别一个一个读,会造成最后读入的一个数读不进去等问题存在! 

 

 

创作挑战赛新人创作奖励来咯,坚持创作打卡瓜分现金大奖

总结

以上是生活随笔为你收集整理的【HDU - 1237】简单计算器 (栈模拟)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。