本文最后更新于:2023年6月12日 下午 15:44
设计一个程序,对输入的以#为结束的算术表达式(包括+,-,*,/,(,)
),首先判断表达式是否含有非法字符(即非+,-,*,/, (,)
之外的字符),
如果含有非法字符,则报错误信息;如果正确,计算并输出这个表示式的值。
本题希望利用算符优先关系,实现对算术四则混合运算表达式的求值。
【输入格式】
以#为结束符的算术表达式。
【输出格式】
对于每组测试数据算术表达式,如果含有非法字符,输出“NO”,否则输出表达式的值,行尾不得有多余的空格。
【样例输入】
3+4*(5-3)#
【样例输出】
11
【样例说明】
输入样例是合法的表达式,因此求表达式的值,并输出11。
【样例输入】
3+;4*(5-3)#
【样例输出】
NO
【样例说明】
输入样例含不合法的字符';',因此输出“NO”。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include <iostream> #include <string> #define isNumber(a) (a >= '0' && a <= '9') using namespace std; bool validJudge(const char& ch) { return (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' || isNumber(ch)); } char* s; int tr(int pre, char oper = 0) { int now; if (*s == '#') return pre; else if (*s == ')') { s++; return pre; } else if (*s == '(') { s++; now = tr(0); } else if (isNumber(*s)) { now = atoi(s); while (isNumber(*s)) s++; } else { switch (oper = *s, ++s, oper) { case '+': return tr(pre, '+'); case '-': return tr(pre, '-'); case '*': return tr(pre, '*'); case '/': return tr(pre, '/'); } } switch (oper) { case '+': return pre + tr(now); case '-': return pre + tr(-now); case '*': return tr(pre * now); case '/': return tr(pre / now); default: return tr(now); } } int main() { string ss; getline(cin, ss); for (int i = 0, len = ss.size() - 1; i < len; i++) { if (!validJudge(ss[i])) { cout << "NO"; return 0; } } if (ss.back() != '#') { cout << "NO"; return 0; } s = &ss[0]; cout << tr(0); return 0; }
|
更多测试样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| (((1+1)*(2+3)/(9-2))+10)*10# 110
((1+1)*2)*2# 8
((1+(1+1))*2# 6
1+1-3# -1
3*(4-1*2)+6/(1+1)# 9
3*(2-1)+1# 4
10*5-2/2+4# 53
|