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