求前缀表达式的值

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式说明:

输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式说明:

输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。

样例输入与输出:

序号 输入 输出
1
+ + 2 * 3 - 7 4 / 8 4
13.0
2
/ -25 + * - 2 3 4 / 8 4
12.5
3
/ 5 + * - 2 3 4 / 8 2
ERROR
4
+10.23
10.2
  1 /*
  2 ** 求前缀表达式的值
  3 */
  4 #include <stdio.h>
  5 #include <stdlib.h>
  6 #include <string.h>
  7 #include <ctype.h>
  8
  9 #define  N  30
 10 #define  TRUE   1
 11 #define  FALSE  0
 12
 13 typedef struct {
 14     double data[N];
 15     int top;
 16 } Stack;
 17
 18 /*
 19 ** 入栈
 20 */
 21 void Push( Stack *ptrs, double item )
 22 {
 23     if( ptrs->top == N - 1 ){
 24         printf( "Stack is full.\n" );
 25         return;
 26     } else {
 27         ptrs->data[ ++( ptrs->top ) ] = item;
 28         return;
 29     }
 30 }
 31
 32 /*
 33 ** 岀栈
 34 */
 35 double Pop( Stack * ptrs )
 36 {
 37     if( ptrs->top == -1 ) {
 38         printf( "Stack is empty.\n" );
 39         return;
 40     } else
 41         return ptrs->data[ ( ptrs->top )-- ];
 42 }
 43
 44 /*
 45 ** 判断是否操作符
 46 */
 47 int IsOperator( char ch )
 48 {
 49     if( ch == ‘+‘ || ch == ‘-‘ || ch == ‘*‘ || ch == ‘/‘ )
 50         return TRUE;
 51     else
 52         return FALSE;
 53 }
 54
 55 /*
 56 ** 计算
 57 */
 58 double Calculate( double a, double b,char ch )
 59 {
 60     switch( ch ) {
 61         case ‘+‘ : return a + b; break;
 62         case ‘-‘ : return a - b; break;
 63         case ‘*‘ : return a * b; break;
 64         case ‘/‘ : return a / b;
 65     }
 66 }
 67
 68 int main()
 69 {
 70     char expr[N];
 71     gets( expr );
 72     int len = strlen( expr );
 73
 74     Stack ss;
 75
 76     ss.top = -1;
 77
 78     double cc = 1;
 79     double tem_sum = 0;
 80     double operand_a;
 81     double operand_b;
 82     double result;
 83     int error = 0; // 记录除数为0的错误情况
 84     int i;
 85     for( i = len - 1; i >= 0; -- i ) {
 86         if( expr[i] >= ‘0‘ && expr[i] <= ‘9‘ ) {
 87             tem_sum += ( expr[i] - ‘0‘ ) * cc;
 88             cc *= 10;
 89             if( expr[i-1] == ‘+‘ ) {
 90                 //printf( "%d\n", tem_sum );
 91                 Push( &ss, tem_sum );
 92                 tem_sum = 0;
 93                 cc = 1;
 94                 i -= 2; // 跳过下一个正号和空格
 95                 continue;
 96             } else if( expr[i-1] == ‘-‘ ) {
 97                 tem_sum = -tem_sum;
 98                 //printf( "%d\n", tem_sum );
 99                 Push( &ss, tem_sum );
100                 tem_sum = 0;
101                 i -= 2; // 跳过下一个负号和空格
102                 continue;
103             } else if( expr[i-1] == ‘ ‘ ) { // 一个数字处理完了
104                 //printf( "%d\n", tem_sum );
105                 Push( &ss, tem_sum );
106                 tem_sum = 0;
107                 cc = 1;
108                 i --;
109                 continue;
110             }
111         } else if( expr[i] == ‘.‘ ) {
112             tem_sum /= cc * 1.0;
113             cc = 1;
114         } else if( IsOperator( expr[i] ) ) {
115             operand_a = Pop( &ss );
116             operand_b = Pop( &ss );
117             if( expr[i] == ‘/‘ && operand_b == 0 ) {
118                 error = 1;
119                 break;
120             } else {
121                 result = Calculate( operand_a, operand_b, expr[i] );
122                 //printf( "result:%.1lf\n", result );
123                 Push( &ss, result );
124                 i--; // 跳过下一个空格
125             }
126         }
127     }
128     if( error != 1 )
129         printf( "%.1lf\n", Pop( &ss ) );
130     else
131         printf( "ERROR\n" );
132
133     return 0;
134 }
时间: 2024-10-22 05:20:02

求前缀表达式的值的相关文章

02-线性结构3. 求前缀表达式的值(25)

02-线性结构3. 求前缀表达式的值(25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算前缀表达式的结果值. 输入格式说明: 输入在一行内给出不超过30个字符的前缀表达式,只包含+.-.*.\以及运算数,不同对象(运算数.运算符号)之

pat02-线性结构3. 求前缀表达式的值(25)

02-线性结构3. 求前缀表达式的值(25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算前缀表达式的结果值. 输入格式说明: 输入在一行内给出不超过30个字符的前缀表达式,只包含+.-.*.\以及运算数,不同对象(运算数.运算符号)之

7-21 求前缀表达式的值

7-21 求前缀表达式的值(25 分) 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算前缀表达式的结果值. 输入格式: 输入在一行内给出不超过30个字符的前缀表达式,只包含+.-.*.\以及运算数,不同对象(运算数.运算符号)之间以空格分隔. 输出格式: 输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR. 输入样例: + + 2

【Zhejiang University PATest】02-3. 求前缀表达式的值

算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算前缀表达式的结果值. 输入格式说明: 输入在一行内给出不超过30个字符的前缀表达式,只包含+.-.*.\以及运算数,不同对象(运算数.运算符号)之间以空格分隔. 输出格式说明: 输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”. 样例输入与输出: 序号 输入 输出 1 + +

PAT 线性结构3. 求前缀表达式的值 栈的应用

题目链接: 前缀表达式求值 题解: 同后缀表达式求值思路: 遇到数值则入栈,遇到操作符则从栈中取出最上面的两个数值进行操作,再将结果入栈,最后得到的栈顶元素则为答案. 前缀表达式从后往前遍历即可. 代码: #include<iostream> #include<cstdio> #include<cstring> #include<stack> using namespace std; int op(char a) { if(a=='+'||a=='-'||a

【PAT】2-3 求前缀表达式的值

求值方法: 对于一个前缀表达式的求值而言,首先要从右至左扫描表达式,从右边第一个字符开始判断,如果当前字符是数字则一直到数字串的末尾再记录下来,如果是运算符,则将右边离得最近的两个“数字串”作相应的运算,以此作为一个新的“数字串”并记录下来.一直扫描到表达式的最左端时,最后运算的值也就是表达式的值.例如,前缀表达式“- 1 + 2 3“的求值,扫描到3时,记录下这个数字串,扫描到2时,记录下这个数字串,当扫描到+时,将+右移做相邻两数字串的运算符,记为2+3,结果为5,记录下这个新数字串,并继续

7-21 求前缀表达式的值(25 分)

前缀表达式的计算机求值:从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈:重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果.例如前缀表达式"- × + 3 4 5 6":(1) 从右至左扫描,将6.5.4.3压入堆栈:(2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈:(3) 接下来是×运算符,因此

3-07. 求前缀表达式的值(25) (ZJU_PAT数学)

题目链接:http://pat.zju.edu.cn/contests/ds/3-07 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算前缀表达式的结果值. 输入格式说明: 输入在一行内给出不超过30个字符的前缀表达式,只包含+.-.*.\以及运算数,不同对象(运算数.运算符号)之间以空格分隔. 输出格式说明: 输出前缀表达式的运算结果,精确到小

求前缀表达式的值(25)

这道题用到了栈,所以就用C++来做咯 当然C也可以做,不过就显得麻烦了. /*--------------------------------------*/ 我们把这道题分成几个部分 1. 输入部分 怎么判断输入的是一个运算符还是一个数? 2. 计算部分 前缀表达式如何计算?在什么情况下我们可以说前缀表达式有错,而报出一个"ERROR"? 首先创建了一个表达式栈expression用来存表达式的内容 第一部分的思路是这样的,每次从输入流获取一个字符串string 1.如果string