C/C++ 算法 中缀转前缀表达式实现1---实现浮点数的加减乘除四则算数(包括浮点数运算,包括括号)

来源:互联网 发布:数据库通配符 编辑:程序博客网 时间:2024/04/30 08:35

C/C++ 算法 中缀转前缀表达式实现1---实现浮点数的加减乘除四则算数(包括浮点数运算,包括括号)

如,输入:1+((2+3)*4)-5,输出前缀表达式:- + 1 * + 2 3 4 5,计算结果等于:16

代码如下:

#include<stack>#include<cstring>#include<iostream>using namespace std;void reverse(char polish[]);bool isoperator(char ch);int priority(char ch);double getpolish_value(char polish[]);void infix_to_polish(char infix[],char polish[]);int main(){char infix[]="1+((2+3)*4)-5";char polish[1024];cout<<infix<<endl;infix_to_polish(infix,polish);cout<<polish<<endl;double result=getpolish_value(polish);cout<<result<<endl;return 0;}void reverse(char str[]){for(int i=0,j=strlen(str)-1;i<j;i++,j--){char ch=str[i];str[i]=str[j];str[j]=ch;}}bool isoperator(char ch){switch(ch){case '+':case '-':case '*':case '/':return true;default:return false;}}int priority(char ch){switch(ch){case ')':return 0;case '+':case '-':return 1;case '*':case '/':return 2;default:return -1;}}void infix_to_polish(char infix[],char polish[]){//从右往左扫描reverse(infix);stack<char> s1;s1.push('#');int i=0,j=0;while(infix[i]!='\0'){if((infix[i]>='0'&&infix[i]<='9')||infix[i]=='.'){polish[j++]=infix[i];}else if(infix[i]==')'){s1.push(infix[i]);}else if(infix[i]=='('){while(s1.top()!=')'){polish[j++]=' ';polish[j++]=s1.top();s1.pop();}s1.pop();}else if(isoperator(infix[i])){polish[j++]=' ';if(s1.empty()){s1.push(polish[i]);}else{if(priority(infix[i])<priority(s1.top())){polish[j++]=s1.top();polish[j++]=' ';s1.pop();}s1.push(infix[i]);}}i++;}while(s1.size()){polish[j++]=' ';polish[j++]=s1.top();s1.pop();}polish[j-1]='\0';reverse(polish);}double getpolish_value(char polish[]){reverse(polish);stack<double> s1;int i=0;double result=0;double x1=0,x2=0;while(polish[i]!='\0'){if(polish[i]>='0'&&polish[i]<='9'){double x=0;int n=0;while(polish[i]>='0'&&polish[i]<='9'){x=x*10+(polish[i]-'0');i++;}if(polish[i]=='.'){i++;while(polish[i]>='0'&&polish[i]<='9'){x=x*10+(polish[i]-'0');i++;n++;}}while(n){x/=10;n--;}s1.push(x);}else if(polish[i]==' '){i++;}else if(polish[i]=='+'){x1=s1.top();s1.pop();x2=s1.top();s1.pop();double temp=x1+x2;s1.push(temp);i++;}else if(polish[i]=='-'){x1=s1.top();s1.pop();x2=s1.top();s1.pop();double temp=x1-x2;s1.push(temp);i++;}else if(polish[i]=='*'){x1=s1.top();s1.pop();x2=s1.top();s1.pop();double temp=x1*x2;s1.push(temp);i++;}else if(polish[i]=='+'){x1=s1.top();s1.pop();x2=s1.top();s1.pop();double temp=x1/x2;s1.push(temp);i++;}}result=s1.top();return result;}

运行结果:


0 0
原创粉丝点击