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;
}
运行结果: