一个模板了 哈哈.
这题由于已经包括了整形、浮点形了,以后也不须要特别处理了。
/* 这里主要是逆波兰式的实现,使用两个stack 这里用字符串来模拟一个stack,第一步,将中缀表达式转变为后缀表达式 第二步,然后再使用一个stack,计算后缀表达式的结果。这一步非常easy出错,考虑到浮点数的问题。 */ #include <iostream> #include <string> #include <cstring> #include <cstdio> #include <stack> #include <iomanip> using namespace std; int cmp(char ch) // 运算符优先级 { switch(ch) { case '+': case '-': return 1; case '*': case '/': return 2; default : return 0; } } void change(char *s1,char *s2) // 中缀表达式转变后缀表达式 { stack <char> s; s.push('#'); int i = 0,len=strlen(s1),cnt=0; while(i < len-1) //如今输入的是1.000 +2 /4=。假设是1.000+2/4的话须要把-1去掉 { if(s1[i]==' ') { i++; continue; } else if(s1[i] == '(') { s.push(s1[i++]); } else if(s1[i] == ')') { while(s.top() != '(') { s2[cnt++]=s.top(); s2[cnt++]= ' '; s.pop(); } s.pop(); i++; } else if(s1[i] == '+'||s1[i] == '-'||s1[i] == '*'||s1[i] == '/') { while(cmp(s.top()) >= cmp(s1[i])) { s2[cnt++]=s.top(); s2[cnt++]= ' '; s.pop(); } s.push(s1[i]); i++; } else { while('0' <= s1[i]&&s1[i] <= '9'||s1[i] == '.') { s2[cnt++]=s1[i++]; } s2[cnt++]= ' '; } } while(s.top() != '#') { s2[cnt++]=s.top(); s2[cnt++]= ' '; s.pop(); } s2[cnt]='