hdu 1237(中序表达式求值)
简单计算器
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11091 Accepted Submission(s): 3607
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2 4 + 2 * 5 - 7 / 11 0
Sample Output
3.00 13.36
Source
#include <stdio.h> #include <string.h> #include <iostream> #include <stdlib.h> using namespace std; int check(char op) { switch(op) { case '#': return 0; case '+': return 1; case '-': return 1; case '*': return 2; case '/': return 2; default: return -1; } } double calculate(double num1, double num2, char op) { switch(op) { case '+': return num1+num2; case '-': return num1-num2; case '*': return num1*num2; case '/': { if(num2 == 0) exit(-1); else return num1/num2; } default : return 0; } } int main() { char data[250]; double number[100]; char operand[200]; int knum, koper; while(gets(data) != NULL){ if(data[0] == '0' && strlen(data) == 1) break; knum = koper = 0; int len = strlen(data); data[len++] = ' '; data[len++] = '#'; //添加标志符 data[len] = '\0'; operand[koper++] = '#'; printf("%s\n", data); for(int i = 0; i < len; i ++) { if(data[i] == ' ') continue; else if(data[i] >= '0' && data[i] <= '9'){ double temp = 0; while(data[i] != ' ' && i < len){ temp = temp*10 + data[i]-'0'; i ++; } number[knum++] = temp; } else { int flag = 1; while(flag){ if(check(data[i]) > check(operand[koper-1])){ operand[koper++] = data[i]; flag = 0; } else { if(data[i] == '#' && operand[koper-1] == '#' ) break; double temp1 = number[--knum]; double temp2 = number[--knum]; char ch = operand[--koper]; temp1 = calculate(temp2, temp1, ch); number[knum++] = temp1; } } } } printf("%d\n", knum); printf("%.2lf\n", number[0]); } return 0; }

浙公网安备 33010602011771号