#include<stdio.h>
#include<iostream.h>
#include<malloc.h>
//建立两个工作站一个存放操作符,是字符型的,一个存放操作数是整型的
#define STACKSIZE 100
#define STACKMORE 10
typedef struct stack{//操作符栈的结构
char *base;
char *top;
int stacksize;
}stack;
typedef struct intstack{//操作数栈的结构
int *base;
int *top;
int stacksize;
}intstack;
void initstack(stack &s)//两个建立函数
{
s.base=(char*)malloc(STACKSIZE*sizeof(char));
if(!s.base) cout<<"error"<<endl;
s.top=s.base;
s.stacksize=STACKSIZE;
}
void intinitstack(intstack &s)
{
s.base=(int*)malloc(STACKSIZE*sizeof(int));
if(!s.base) cout<<"error"<<endl;
s.top=s.base;
s.stacksize=STACKSIZE;
}
void push(stack &s,char e)//两个压栈的函数
{
if(s.top -s.base>=s.stacksize)
{
s.base=(char*)realloc(s.base,(s.stacksize+STACKMORE)*sizeof(char));
if(!s.base) cout<<"error"<<endl;
s.top=s.stacksize+s.base;
s.stacksize+=STACKMORE;
}
*s.top++ =e;
}
void intpush(intstack &s,int e)
{
if(s.top -s.base>=s.stacksize)
{
s.base=(int*)realloc(s.base,(s.stacksize+STACKMORE)*sizeof(int));
if(!s.base) cout<<"error"<<endl;
s.top=s.stacksize+s.base;
s.stacksize+=STACKMORE;
}
*s.top++ =e;
}
char gettop(stack s)//两个取值函数
{
char e;
if(s.base ==s.top )cout<<"error";
e=*(s.top -1);
return e;
}
int intgettop(intstack s)
{
int e;
if(s.base ==s.top )cout<<"error";
e=*(s.top -1);
return e;
}
void pop(stack &s,char &e)//两个删除并返回其值的函数
{
if(s.base ==s.top )cout<<"error";
e=*(--s.top);
}
void intpop(intstack &s,int &e)
{
if(s.base ==s.top )cout<<"error";
e=*(--s.top);
}
char op[7][7]={'>', '>', '<', '<', '<', '>', '>', //定义操作符的优先性
'>', '>', '<', '<', '<', '>', '>',
'>', '>', '>', '>', '<', '>', '>',
'>', '>', '>', '>', '<', '>', '>',
'<', '<', '<', '<', '<', '=', 'E',
'>', '>', '>', '>', 'E', '>', '>',
'<', '<', '<', '<', '<', 'E', '='};
int getsign(char optr)
{
int sign;
switch(optr)
{
case '+': sign = 0; break;
case '-': sign = 1; break;
case '*': sign = 2; break;
case '/': sign = 3; break;
case '(': sign = 4; break;
case ')': sign = 5; break;
case '#': sign = 6; break;
}
return (sign);
}
char precede(char optr1,char optr2)
{
int sign1=getsign(optr1);
int sign2=getsign(optr2);
return(op[sign1][sign2]);
}
int operate(int a,char theta ,int b)//定义四则混合运算
{
int result=0;
switch(theta)
{
case '+': result = a+b; break;
case '-': result = a-b; break;
case '*': result = a*b; break;
case '/': result = a/b; break;
}
return result;
}
int read()//定义输出函数
{
int a,b,c;
char theta,x;
stack OPTR;
intstack OPND;
initstack(OPTR);
push(OPTR,'#');
intinitstack(OPND);
c=getchar();
int sum=0;
while(c!='#'|| gettop(OPTR)!='#')
{
if ((c>='0') && (c<='9'))
{
sum=sum*10+(c-'0');
c=getchar();
if(!((c>='0') && (c<='9')))
{
intpush(OPND,sum);
sum=0;
}
}
else
{
switch (precede(gettop(OPTR),c))
{
case '<':push(OPTR,c);
c=getchar();
break;
case '=':pop(OPTR,x);
c=getchar();
break;
case '>':pop(OPTR,theta);
intpop(OPND,b);
intpop(OPND,a);
intpush(OPND,operate(a,theta,b));
break;
}
}
}
return intgettop(OPND);
}
void main()//函数入口
{
int result=0;
cout<<"please put an experssion"<<endl;
result=read();
cout<<"the result is:"<<result<<endl;
return ;
}