题目:从键盘上输入一个逆波兰表达式,用伪代码写出其求值程序。规定:逆波兰表达式的长度不超过一行,以$符作为输入结束,操作数之间用空格分隔,操作符只可能有+-*/四种运算。
分析:从键盘端输入,则进行运算前需将操作数转化为数字
将a='1'转为数字1:a='1'-'0'
将b='12'转为数字12: b=a*10+'2'-'0'
将c='1.2'转为数字1.2:c=b/10.0 也可以是:c=a+('2'-'0')/10.0
float expr(){
float OPND[30]; //操作数栈
init(OPND); //初始化栈
float num=0.0;
scanf("%c",&x); //x是字符型变量
while(x != '$'){
switch(x){
case '0'<=x<='9':
while((x>='0' && x<='9') || x=='.') //拼数
if(x!='.'){ //处理整数
num=num*10+(ord(x) - ord('0')); //ord()返回编码对应字符
scanf("%c",&x);
}
else{ //处理小数部分
scale=10.0; //实现小数点位移
scanf("%c",&x);
while(x>='0' && x<='9') {
num=num+(ord(x) - ord('0'))/scale;
scale=scale*10;
scanf("%c",&x);
}
}//else
push(OPND,num); //压入栈
num=0.0; //下个数初始化
// break; 不能加break语句,因为此时需要对新读入的字符进行’+-*/'判断
case x='':break; //遇空格,继续读下一个字符
case x='+': push(OPND,pop(OPND)+pop(OPND));break;
case x='-': x1=pop(OPND);x2=pop(OPND);push(OPND,x2-x1);break; //减法和除法需注意,是后出来的操作数-先出来的操作数
case x='*': push(OPND,pop(OPND)*pop(OPND));break;
case x='/': x1=pop(OPND);x2=pop(OPND);push(OPND,x2/x1);break;
default: //其他符号不作处理
}//switch
scanf("%c",&x); //读入表达式中的下一个字符
} //while
printf("后缀表达式的值为%f",pop(OPND););
}