前缀表达式求值


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

pat:求前缀表达式的值

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<stack>
using namespace std;

int main(){
    char s[33];
    int i,f=0,k=0;
    double a,b,num=0,c;
    stack<double> st;
    gets(s);int l=strlen(s);
    for(i=l-1;i>=0;i--){
        if(isdigit(s[i])){
            num+=(s[i]-'0')*pow(10.0,k);
            k++;
        }else if(s[i]=='.'){
            num=num*pow(10.0,-k);
            k=0;
        }
        else{
            if(s[i]=='+'&&s[i+1]!=' '){
                continue;
            }
            if(s[i]=='-'&&s[i+1]!=' '){
                num=-num;
                continue;
            }
            if(s[i]==' '){
                st.push(num);
                k=num=0;
                continue;
            }
            if(st.size()<2){
                break;
            }
            a=st.top();st.pop();
            b=st.top();st.pop();
            if(s[i]=='+'){
                c=a+b;
            }else if(s[i]=='-'){
                c=a-b;
            }else if(s[i]=='*'){
                c=a*b;
            }else if(s[i]=='/'){
                if(b==0)    break;
                c=a/b;
            }
            st.push(c);
        }
    }
    if(k){
        st.push(num);
    }
    if(st.size()!=1||i!=-1){
        puts("ERROR");
    }else{
        printf("%.1f\n",st.top());
    }
    return 0;
}
/*
- / 10 + 3 2 * 2 3
*/

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM