数据结构之表达式求解----完整版(无敌完整版)
(1) 运算符包括:+、-、*、-、^(乘方)、括号
(2)实数(包括多位整数各种);
表达式的书写形式
中缀--日常写的,但是他的计算方式较为复杂
前缀--计算机一般存储结构
后缀--日常计算的方式----一遍编写计算器都是通过后缀表达式+栈来解决--其符号优先级大于左边也高于右边,则可以计算此运算符
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxsize=100005;
struct node_optr
{
char data[maxsize];
int top;
} optr; ///存运算符的
struct node_oprd
{
double data[maxsize];
int top;
} oprd; ///存操作数据的
void exp_trans(char exp[],char post_exp[])///前缀表达式转化为后缀表达式
{
//printf("exp_trans\n");
int i=0,j=0;
char ch=exp[i++];
optr.top=-1;
while(ch!='=')
{
// printf("ch %c\n",ch);
if(ch=='(')///左括号直接push进optr.data
{
optr.data[++optr.top]=ch;
}
else if(ch==')')///右括号的话就是把oprd里面的数据全部pop出来,直到为empty或者遇到“左括号”
{
while(optr.data[optr.top]!='('&&optr.top!=-1)
{
post_exp[j++]=optr.data[optr.top--];///post_exp从1开始存储
if(optr.top==-1)break;
}
optr.top--;
}
else if(ch=='+'||ch=='-')
{
while(optr.data[optr.top]!='(' && optr.top!=-1)
{
post_exp[j++]=optr.data[optr.top--];
}
optr.data[++optr.top]=ch;
}
else if(ch=='*'||ch=='/')
{
while(optr.data[optr.top]!='(' && optr.top!=-1 &&(optr.data[optr.top]=='*'||optr.data[optr.top]=='/'))
{
post_exp[j++]=optr.data[optr.top--];
}
optr.data[++optr.top]=ch;
}
else if(ch=='^')///优先度很高
{
optr.data[++optr.top]=ch;
//post_exp[j++]=ch;
}
else
{
while((ch>='0'&&ch<='9')||ch=='.')
{
post_exp[j++]=ch;
ch=exp[i++];
}
i--;
post_exp[j++]='#';///断开整数
}
ch=exp[i++];
}
while(optr.top!=-1)
{
post_exp[j++]=optr.data[optr.top--];
}
post_exp[optr.top--]=='\0';///结束标志
}
void cal_exp(char post_exp[])
{
//printf("void cal_exp\n");
int num;
char ch;
int i=0;
oprd.top=-1;
ch=post_exp[i++];
while(ch!='\0')///后缀表达式没有结束
{
//printf("ch %c\n",ch);
///运算时一定要注意-和/,先入栈的为减数(除数),后入栈的是被减数(被除数);
if(ch=='+')
{
oprd.data[oprd.top-1]=oprd.data[oprd.top]+oprd.data[oprd.top-1];
oprd.top--;
}
else if(ch=='-')
{
oprd.data[oprd.top-1]=oprd.data[oprd.top-1]-oprd.data[oprd.top];
oprd.top--;
}
else if(ch=='*')
{
oprd.data[oprd.top-1]=oprd.data[oprd.top]*oprd.data[oprd.top-1];
oprd.top--;
}
else if(ch=='/')
{
if(oprd.data[oprd.top]==0)
{
printf("被除数不能为0\n");
return ;
}
else
{
oprd.data[oprd.top-1]=oprd.data[oprd.top-1]*1.0/oprd.data[oprd.top];
oprd.top--;
}
}
else if(ch=='^')
{
//cout<<"oprd.data[oprd.top]"<<oprd.data[oprd.top]<<" ";
//cout<<"oprd.data[oprd.top-1]"<<oprd.data[oprd.top-1]<<" ";
//cout<<endl;
oprd.data[oprd.top-1]=pow(oprd.data[oprd.top-1],oprd.data[oprd.top]);
oprd.top--;
//cout<<oprd.data[oprd.top]<<endl;
///1+2^3+3^2=
}
else
{
double num=0;
int f=0;
double temp=0.1;
while((ch>='0'&&ch<='9')||ch=='.')
{
if(f==0&&ch=='.') f=1;
else
{
if(f==0) num=num*10+ch-'0';
else if(f) num=num+temp*(ch-'0'),temp*=0.1;
}
ch=post_exp[i++];
}
oprd.data[++oprd.top]=num;
//printf("num %d\n",num);
}
ch=post_exp[i++];
}
}
int main()
{
char exp[maxsize];
scanf("%s",exp);
char post_exp[maxsize];
exp_trans(exp,post_exp);
printf("post_exp %s\n",post_exp);
cal_exp(post_exp);
double ans=oprd.data[oprd.top];
if(fabs(ans-floor(ans))<0.00001) printf("%.f",ans);
else printf("%.5f",ans);
return 0;
}