部分代码源自于lyjyyds
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
using namespace std;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
typedef char SElemtype;
typedef char Status;
typedef struct StackNode
{
SElemtype data;
struct StackNode *next;
}StackNode,*LinkStack;
Status InitStack(LinkStack &S)
{
S=NULL;
return OK;
}
Status Push(LinkStack &S,SElemtype e)
{
LinkStack p;
p=new StackNode;
p->data=e;
p->next=S;
S=p;
return OK;
}
Status Pop(LinkStack &S,SElemtype &e)
{
LinkStack p;
p=new StackNode;
if(S==NULL)
return ERROR;
e=S->data;
p=S;
S=S->next;
delete p;
return OK;
}
SElemtype GetTop(LinkStack &S)
{
if(S!=NULL)
return S->data;
}
char Precede(char a,char b)
{
int x,y;
if(a=='+'||a=='-') x=3;
if(a=='*'||a=='/') x=5;
if(a=='(') x=1;
if(a==')') x=7;
if(a=='#') x=0;
if(b=='+'||b=='-') y=2;
if(b=='*'||b=='/') y=4;
if(b=='(') y=6;
if(b==')') y=1;
if(b=='#') y=0;
if(x>y) return '>';
if(x==y) return '=';
if(x<y) return '<';
}
char Operate(char a,char theta,char b)
{
switch(theta)
{
case'+':return a+b-'0';
break;
case'-':return a-b+'0';
break;
case'*':return (a-'0')*(b-'0')+'0';
break;
case'/':return (a-'0')/(b-'0')+'0';
break;
default:return '0';
break;
}
}
char EvaluateExpression()
{
LinkStack OPND;
LinkStack OPTR;
char ch,a,theta,b,x;
InitStack(OPND);
InitStack(OPTR);
Push(OPTR,'#');
cin>>ch;
while(ch!='#'||GetTop(OPTR)!='#')
{
if(ch>='0'&&ch<='9')
{
Push(OPND,ch);
cin>>ch;
}
else
{
switch(Precede(GetTop(OPTR),ch))
{
case'<':Push(OPTR,ch);
cin>>ch;
break;
case'>':Pop(OPTR,theta);
Pop(OPND,b);
Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
case'=':Pop(OPTR,x);
cin>>ch;
break;
}
}
}
return GetTop(OPND);
}
int main()
{
int x=EvaluateExpression()-'0';
printf("%d",x);
return 0;
}