7-211 求前缀表达式的值 (25 分)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4
的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4
。请设计程序计算前缀表达式的结果值。
输入格式:
输入在一行内给出不超过30个字符的前缀表达式,只包含+
、-
、*
、/
以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式:
输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR
。
输入样例:
+ + 2 * 3 - 7 4 / 8 4
结尾无空行
输出样例:
13.0
结尾无空行
#include<stdio.h> #include<stdlib.h> #include<string.h> double exp(); int main() { printf("%.1f",exp()); return 0; } double exp() { char a[10]; //存储第一个非空格字符 scanf("%s",a); if( !a[1]) { //a[1]为空只有一位 switch( a[0]) { case '+' : return exp()+exp(); case '-' : return exp()-exp(); case '*' : return exp()*exp(); case '/' : { double fenzi = exp(); double fenmu = exp(); if(fenmu !=0) return fenzi/fenmu; else { printf("ERROR"); //分母为0 exit(0); //程序结束 } } default : return atof(a); //字符串转换为浮点数 } } else { if( a[0]=='-' || a[0]=='+') { char flag = a[0]; //记录符号 int i =0 ; while(a[i]) { a[i] = a[i+1]; i++; } if(flag=='-') return 0-atof(a); else return atof(a); } else return atof(a); } }
#include<iostream> #include<string.h> #include<stdio.h> #include<stdlib.h> using namespace std; #define ERROR 0 #define OK 1 #define OVERFLOW -2 #define TRUE 1 #define FALSE 0 typedef struct Node *ptr; typedef struct Node{ int *base;//头指针 int *top;//尾指针 int stacksize;//最大容量 }Sqstack; int InitStack(Sqstack &S) //此处是构造一个空栈 { S.base = (int *)malloc(100 *sizeof(int)); if (!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = 100; return OK; } float Push(Sqstack &S,float e)//入栈操作 { if(S.top-S.base>=S.stacksize) { S.base=(int *)realloc(S.base,(S.stacksize+10)*sizeof(int)); if(!S.base) exit(OVERFLOW); S.top=S.base+S.stacksize; S.stacksize+=10; } *S.top++=e; return OK; } float GetTop(Sqstack S,float &e)//返回头顶指针 { if(S.top==S.base) return ERROR; else return e=*(S.top-1); } float Pop(Sqstack &S,float &e) { if(S.top==S.base) return ERROR; else return e=*--S.top; } float before(char A[],int len) { int i;float x1,x2,temp=1; float e; Sqstack bds; InitStack(bds); for(i=len-1;i>=0;i--) { if('0'<=A[i]&&A[i]<='9') Push(bds,A[i]-'0'); else { Pop(bds,x2); Pop(bds,x1); switch(A[i]) { case '+':temp=x1+x2;break; case '-':temp=x2-x1;break; case '*':temp=x1*x2;break; case '/':{ if(x1==0) { cout<<ERROR<<endl; return ERROR;} else { temp=x2/x1;break;} } } Push(bds,temp); } } GetTop(bds,e); return e; } int main() { char pre[30];int len; float e; scanf("%s",pre);//输入前缀表达式 len=(int)strlen(pre); e=before(pre,len);//输出前缀表达式的计算值 printf("%.1f\n",e); return 0; }