#include
#include
#include
#define ERROR 0
#define OK 1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
char a[7] = {'+','-','*','/','(',')','#'};
char b[7][7] = {
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','\0'},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<','\0','='},
};
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
typedef struct
{
char *base;
char *top;
char stacksize;
}sqstack;
Status InitStack(SqStack &S)
{ //创建一个空栈S
S.base =(int *)malloc(STACK_INIT_SIZE * sizeof(int));
if(!S.base) exit (OVERFLOW);
S.top =S.base;
S.stacksize =STACK_INIT_SIZE;
return OK;
}//InitStack
int GetTop(SqStack S,int & e)
{
if(S.top==S.base) return ERROR;
e = *(S.top-1);
return e;
}
Status Push(SqStack &S,int e)
{
if(S.top-S.base >=S.stacksize )
{
S.base=(int *)realloc(S.base ,(S.stacksize +STACKINCREMENT)*sizeof(int));
if(!S.base ) exit(OVERFLOW);
S.top =S.base +S.stacksize;
S.stacksize +=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
int Pop(SqStack &s,int &e)
{
if(s.top ==s.base ) return ERROR;
e=*--s.top;
return e;
}
//################
Status InitStackc(sqstack &S)
{ //创建一个空栈S
S.base =(char *)malloc(STACK_INIT_SIZE * sizeof(char));
if(!S.base) exit (OVERFLOW);
S.top =S.base;
S.stacksize =STACK_INIT_SIZE;
return OK;
}//InitStack
char GetTopc(sqstack S,char & e)
{
if(S.top==S.base) return ERROR;
e=*(S.top-1);
return e;
}
Status Pushc(sqstack &S,char e)
{
if(S.top-S.base >=S.stacksize )
{
S.base=(char *)realloc(S.base ,(S.stacksize +STACKINCREMENT)*sizeof(char));
if(!S.base ) exit(OVERFLOW);
S.top =S.base +S.stacksize;
S.stacksize +=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
char Popc(sqstack &s,char &e)
{
if(s.top ==s.base ) return ERROR;
e=*--s.top;
return e;
}
//###############
int sw(char a){
int m;
switch(a){
case '+':
m = 0;
break;
case '-':
m = 1;
break;
case '*':
m = 2;
break;
case '/':
m = 3;
break;
case '(':
m = 4;
break;
case ')':
m = 5;
break;
case '#':
m = 6;
break;
}
return m;
}
//*****************
char precede(char op1,char op2){
int k,l;
char j;
k = sw(op1);//6
l = sw(op2);//0
j = b[k][l];
return j;
}
//***********
int In(char a){
if(a =='+'||'-'||'*'||'/'||'('||')','#')
return OK;
else
return ERROR;
}
int Operate(int a, char b, int c){
int s , d;
int mn;
char f;
s = a;f = b;d = c;
switch (f){
case '+':
mn = s + d;
break;
case '-':
mn = s - d;
break;
case '*':
mn = s * d;
break;
case '/':
mn = s / d;
break;
}
return mn;
}
int operand(){
char c;int b, a;
char e; char OP;char x ;
char theta;
SqStack OPND;
sqstack OPTR;
InitStackc(OPTR);Pushc(OPTR,'#');
InitStack(OPND);c=getchar();
while(c!='#'|| GetTopc(OPTR,e)!='#'){
if(In(c) == 0){
Push(OPND,c);
c=getchar();
}
else{
char cb ;
cb =precede(GetTopc(OPTR,OP),c);
switch(cb){
case'<':
Pushc(OPTR,c); c=getchar();
break;
case'=':
Popc(OPTR,x); c=getchar();
break;
case'>':
Popc(OPTR,theta);
Pop(OPND,b); Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
}//switch
}//else
}//while
return GetTop(OPND,b);
}
void main(){
printf("请输入表达式:\n");
printf("%f\n",operand());
}