注:1.难点在输入,用atoi函数会简洁很多。

        2.漏考虑了运算符多了的情况。

题目:

后缀表达式,又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行。

运用后缀表达式进行计算的具体做法:

建立一个操作数栈S。然后从左到右读表达式,如果读到操作数就将它压入栈S中,如果读到n元运算符(即需要参数个数为n的运算符)则取出由栈顶向下的n项操作数进行运算,再将运算的结果代替原栈顶的n项压入栈中。重复上面过程,如果后缀表达式读完且栈中只剩一个操作数,则该数就是运算结果;如果后缀表达式读完但是栈中操作数多于一个,则后缀表达式错误;如果栈中操作数只剩一个,但是后缀表达式还未读完且当前运算符为双元操作符,则后缀表达式同样错误。

输入格式:

在一行中输入一个以#号结束的非空后缀式,#不属于表达式的一部分,操作数和运算符都以空格分隔,运算数为绝对值不超过100的整数,运算符仅有+、-、*、/ 四种。

输出格式:

输出后缀式计算结果,所有的计算都只取结果的整数部分。题目保证计算的中间和最后结果的绝对值都不超过109。

如果执行除法时出现分母为零的非法操作,则在一行中输出:Error: X/0,X是当时的分子。

如果后缀表达式中运算符多了或者少了,则在一行中输出:Expression Error: X,X是当时栈顶元素。

输入样例1:

5 -2 + 3 * #

输出样例1:

9

输入样例2:

5 -2 2 + / #

输出样例2:

Error: 5/0

输入样例3:

5 -1 3 + / - * #

输出样例3:

Expression Error: 2

代码: 

  1. #include<stdio.h>
  2. #include<ctype.h>
  3. #define N 1005
  4. int stk[N], n = 0;
  5. char s[N];
  6. int main() {
  7. gets(s);
  8. int i = 0, flag = 1;
  9. while(s[i] != '#') {//printf("%d ---\n", i);
  10. if(isdigit(s[i])) {
  11. ++ n;
  12. while(isdigit(s[i])) {
  13. stk[n] = stk[n] * 10 + s[i] - '0';
  14. ++ i;
  15. }
  16. } else if(s[i] == '-' && isdigit(s[i+1])) {
  17. ++ i; ++ n;
  18. while(isdigit(s[i])) {
  19. stk[n] = stk[n] * 10 + s[i ++] - '0';
  20. }
  21. stk[n] = -stk[n];
  22. } else if(s[i] != ' ') {
  23. if(n < 2) {
  24. printf("Expression Error: %d", stk[1]);
  25. flag = 0;
  26. return 0; //直接退出
  27. }
  28. switch(s[i]) {
  29. case '+'://printf("%d**%d %d\n", stk[1], stk[2], n);
  30. stk[n-1] += stk[n]; //printf("%d**%d\n", stk[1], stk[2]);
  31. stk[n] = 0;
  32. n --;
  33. break;
  34. case '-':
  35. stk[n-1] -= stk[n];
  36. stk[n] = 0;
  37. n --;
  38. break;
  39. case '*':
  40. stk[n-1] *= stk[n];
  41. stk[n] = 0;
  42. n --;
  43. break;
  44. case '/':
  45. if(!stk[n]){
  46. printf("Error: %d/0", stk[n-1]);
  47. flag = 0;
  48. return 0;
  49. }
  50. stk[n-1] /= stk[n];
  51. stk[n] = 0;
  52. n --;
  53. break;
  54. }
  55. ++ i;
  56. }
  57. else ++ i;
  58. //for(int i = 1; i <= n; ++ i) printf("%d*", stk[i]);
  59. //puts("");
  60. }
  61. if(n > 1) printf("Expression Error: %d", stk[n]); //忘记考虑运算符多了的情况
  62. else if(flag) printf("%d", stk[1]);
  63. return 0;
  64. }