用链表实现四则运算
/*
1、只能进行整数运算,
2、可以有括号的嵌套,如(a+b*(c+d)-e)-f,
但对(a+((b+c)+d*e)-f)形如的算式无法计算
*/
#include
#include
#include
#include
using namespace std;
struct Element
{
double data;
char sign;
char bracket_left;
char bracket_right;
Element *next;
};
int check(char *s)
{
int count_bracket=0;
int i=0;
while(i
{
if(s[i]=='(') count_bracket++;
else if(s[i]==')') count_bracket--;
if(count_bracket<0)
return 0;
if(!(s[i]>='0'&&s[i]<='9'||s[i]==')'||s[i]=='('||s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'))
return 0;
i++;
}
if(count_bracket) return 0;
return 1;
}
void create_expression(char *s,Element *head)
{
Element *p=head;
p->next=(Element *)malloc(sizeof(Element));
p=p->next,p->next=NULL;
p->bracket_left=p->bracket_right='\0';
p->sign='\0',p->data=0;
int x=0;
while(x
{
if(s[x]>='0'&&s[x]<='9')
{
while(s[x]>='0'&&s[x]<='9'&&s[x]!='\0')
p->data*=10,p->data+=s[x++]-'0';
x--;
}
else if(s[x]=='+'||s[x]=='-'||s[x]=='*'||s[x]=='/')
{
p->next=(Element *)malloc(sizeof(Element));
if(!p->next)
{
cout<
exit(0);
}
p=p->next,p->next=NULL;
p->bracket_left=p->bracket_right='\0';
p->sign=s[x],p->data=0;
}
else if(s[x]==')')
{
p->bracket_right=')';
p->bracket_left='\0';
}
else if(s[x]=='(')
{
p->bracket_left='(';
p->bracket_right='\0';
}
x++;
}
p=head->next;
while(p->next) p=p->next;
p->next=(Element *)malloc(sizeof(Element));
p=p->next;
p->data=0,p->sign='+',p->next=NULL;
p->bracket_left=p->bracket_right='\0';
}
/*double chang_int(char *s)
{
double sum=0;
int x=0,mark=0;
while(x
{
if(s[x]=='.')
{
mark=1;
break;
}
sum*=10,sum+=s[x]-'0';
x++;
}
if(mark)
{
double m=0;
for(int i=strlen(s)-1;i>x;i--)
m+=s[i]-'0',m/=10;
sum+=m;
}
return sum;
}*/
double calculate(Element *start,Element *end)
{
Element *p=start;
while(p!=end)
{
if(p->next->sign=='*')
{
p->data*=p->next->data;
p->next=p->next->next;
p=start;continue;
}
else if(p->next->sign=='/')
{
p->data/=p->next->data*1.0;
p->next=p->next->next;
p=start;continu
e;
}
p=p->next;
}
double sum=start->data;
start=start->next;
while(start!=end)
{
if(start->sign=='+') sum+=start->data;