前缀表达式
前缀表达式求值方式是从后向前算数,遇到符号就把栈中的上面两个数拿出来计算,然后再压栈。
using namespace std;
double a[1005];
int top;
char str[105];
int is_op(char ch){
if (ch=='+' || ch=='-' || ch=='*' || ch=='/'){
return 1;
}else{
return 0;
}
}
int main(){
while(cin.getline(str, 105)){
memset(a, 0, sizeof(0));
top=0;
int len=strlen(str);
int pow=1;
double tsum=0;
int flagErr=0; //err->flag=1
for (int i=len-1; i>=0; i--){
if (str[i]>='0' && str[i]<='9'){
tsum+=(str[i]-'0')*pow;
pow*=10;
}else if (str[i]=='.'){
tsum=tsum/(pow*1.0);
pow=1;
}else if (str[i]==' ' && tsum!=0){
a[++top]=tsum;
tsum=0, pow=1;
}else if (str[i]=='-' && tsum!=0){
a[++top]=-tsum;
tsum=0;
pow=1;
i--;
}else if (str[i]=='+' && tsum!=0){
a[++top]=tsum;
tsum=0;
pow=1;
i--;
}else if (is_op(str[i])){
double x=a[top]; top--;
double y=a[top]; top--;
double z=0;
if (str[i]=='+'){
z=x+y;
}else if (str[i]=='-'){
z=x-y;
}else if (str[i]=='*'){
z=x*y;
}else if (str[i]=='/'){
if (y==0){
flagErr=1;
break;
}else{
z=x/y;
}
}
a[++top]=z;
}
}
if (flagErr==1){
printf("err\n");
}else{
printf("%.1f\n", a[top]);
}
}
return 0;
}
中缀表达式
using namespace std;
double a[205];
int top, flag;
string str;
int main()
{
while (getline(cin, str)){
memset(a, 0, sizeof(a));
int len=str.length();
top=0, flag=1;
if (str[0]=='0' && len==1)
break;
double ans=0, sum=0;
for (int i=0; i<len; i++){
if (str[i]==' ') continue;
if (str[i]>='0' && str[i]<='9')
ans=ans*10+str[i]-'0';
else{
if (flag==1){a[++top]=ans; ans=0;
}
if (flag==2){a[++top]=-ans; ans=0;
}
if (flag==3){double tmp=a[top];
a[top]=tmp*ans;
ans=0;
}
if (flag==4){double tmp=a[top];
a[top]=tmp/ans;
ans=0;
}
if (str[i]=='+') flag=1;
if (str[i]=='-') flag=2;
if (str[i]=='*') flag=3;
if (str[i]=='/') flag=4;
}
if (i==len-1){
if (flag==1){a[++top]=ans; ans=0;
}
if (flag==2){a[++top]=-ans; ans=0;
}
if (flag==3){double tmp=a[top];
a[top]=tmp*ans;
ans=0;
}
if (flag==4){double tmp=a[top];
a[top]=tmp/ans;
ans=0;
}
}
}
for (int i=1; i<=top; i++)
sum+=a[i];
printf("%.2f\n", sum);
}
return 0;
}
后缀表达式
using namespace std;
double a[1005];
int top;
char str[105];
int is_op(char ch){
if (ch=='+' || ch=='-' || ch=='*' || ch=='/'){
return 1;
}else{
return 0;
}
}
int main(){
while (cin.getline(str, 105)){
memset(a, 0, sizeof(a));
top=0;
int len=strlen(str);
int tsum=0;
for (int i=0; i<len; i++){
if (str[i]>='0' && str[i]<='9'){
tsum=tsum*10+str[i]-'0';
}else if (str[i]==' ' && tsum!=0){
a[++top]=tsum;
tsum=0;
}else if (is_op(str[i])){
double y=a[top]; top--;
double x=a[top]; top--;
double z;
if (str[i]=='+'){
z=x+y;
}else if (str[i]=='-'){
z=x-y;
}else if (str[i]=='*'){
z=x*y;
}else if (str[i]=='/'){
z=x/y;
}
a[++top]=z;
}
}
printf("%.1f\n", a[top]);
}
return 0;
}