前綴表達式求值


對於一個前綴表達式的求值而言,首先要從右至左掃描表達式,從右邊第一個字符開始判斷,如果當前字符是數字則一直到數字串的末尾再記錄下來,如果是運算符,則將右邊離得最近的兩個“數字串”作相應的運算,以此作為一個新的“數字串”並記錄下來。一直掃描到表達式的最左端時,最后運算的值也就是表達式的值。例如,前綴表達式“- 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