求算术运算表达式的值:
#include<iostream>
#include <string>
#include<stdlib.h>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef char ElemType;//定义类型
typedef float ElemTypeF;
typedef struct Stack
{
ElemType data;
Stack *next;
}*LinkStack,Stack;
typedef struct StackF
{
ElemTypeF data;
StackF *next;
}*LinkStackF,StackF;
Status InitStack(LinkStack &s)
{
s=(Stack *)malloc(sizeof(Stack));
if(!s)
{
return ERROR;
}
s->next=NULL;
return OK;
}
Status InitStackF(LinkStackF &s)
{
s=(StackF *)malloc(sizeof(StackF));
if(!s)
{
return ERROR;
}
s->next=NULL;
return OK;
}
Status StackLength(LinkStack s)
{
LinkStack p;
p=s->next;
int count=0;
while(p)
{
count++;
p=p->next;
}
return count;
}
Status StackLengthF(LinkStackF s)
{
LinkStackF p;
p=s->next;
int count=0;
while(p)
{
count++;
p=p->next;
}
return count;
}
Status Push(LinkStack &s,ElemType e)
{
LinkStack p;
p=s;
while(p->next)
{
p=p->next;
}
p->next=(Stack *)malloc(sizeof(Stack));
if(!(p->next))
{
return ERROR;
}
p->next->data=e;
p->next->next=NULL;
return OK;
}
Status PushF(LinkStackF &s,ElemTypeF e)
{
LinkStackF p;
p=s;
while(p->next)
{
p=p->next;
}
p->next=(StackF *)malloc(sizeof(StackF));
if(!(p->next))
{
return ERROR;
}
p->next->data=e;
p->next->next=NULL;
return OK;
}
Status Pop(LinkStack &s,ElemType &e)
{
if(StackLength(s)==0)
{
return ERROR;
}
LinkStack p,q;
p=s;
while(p->next)
{
q=p;
p=p->next;
}
e=p->data;
q->next=NULL;
free(p);
return OK;
}
Status PopF(LinkStackF &s,ElemTypeF &e)
{
if(StackLengthF(s)==0)
{
return ERROR;
}
LinkStackF p,q;
p=s;
while(p->next)
{
q=p;
p=p->next;
}
e=p->data;
q->next=NULL;
free(p);
return OK;
}
void check(LinkStackF &sf,ElemType ch)
{
ElemTypeF x,y;
switch(ch)
{
case '+':PopF(sf,x);
PopF(sf,y);
PushF(sf,x+y);
break;
case '-':PopF(sf,x);
PopF(sf,y);
PushF(sf,y-x);
break;
case '*':PopF(sf,x);
PopF(sf,y);
PushF(sf,x*y);
break;
case '/':PopF(sf,x);
PopF(sf,y);
if(x==0)
{
cout<<"输入错误。。\n";
exit(0);
}
PushF(sf,y/x);
break;
}
}
int main()
{
LinkStack S;
InitStack(S);
LinkStackF sf;
InitStackF(sf);
ElemType e;
ElemTypeF f;
string str;
cout<<"请输入运算表达式:\n";
cout<<"注意不足之处:例如,计算5*5/2*4时应该写为((5*5)/2)*4,否则结果不对 :\n";
cin>>str;
char temp[1000];
int j=0;
for(int i=0;i<str.length();i++)
{
while(str[i]>='0'&&str[i]<='9')
{
temp[j]=str[i];
j++;
temp[j]='\0';
i++;
if(str[i]<'0'||str[i]>'9')
{
f=atof(temp);
PushF(sf,f);
j=0;
}
}
if(str[i]=='+'||str[i]=='-')
{
if(!StackLength(S))
{
Push(S,str[i]);
}
else
{
do
{
Pop(S,e);
if(e=='(')
{
Push(S,e);
}else
{
check(sf,e);
}
}while(StackLength(S)&&e!='(');
Push(S,str[i]);
}
}
else if(str[i]=='*'||str[i]=='/'||str[i]=='(')
{
Push(S,str[i]);
}
else if(str[i]==')')
{
while(true)
{
Pop(S,e);
if(e=='(')
{
break;
}
else
{
check(sf,e);
}
}
}
else if(str.length()<=i)
{
break;
}
else
{
cout<<"\n输入格式错误。。\n"<<endl;
}
}
while(StackLength(S))
{
Pop(S,e);
check(sf,e);
}
cout<<endl;
PopF(sf,f);
cout<<"结果为:"<<f<<endl;
return OK;
}