#include<stdio.h>
#include<stdlib.h>
#include<process.h>
#define TRUE 1
#define FLASE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define stack_size 100
#define stackincrement 10
typedef int status;
typedef float SElemType;
typedef struct SNode{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
status InitStack(SqStack &s)
{//栈的初始化,建立一个空栈
s.base=(SElemType*)malloc(stack_size*sizeof(SElemType));
if(!s.base) exit(OVERFLOW);
s.top=s.base;
s.stacksize=stack_size;
}
status Gettop(SqStack s,SElemType &e)
{
if(s.top==s.base)
return ERROR;
e=*(s.top-1);
return OK;
}
status Push(SqStack &s,SElemType e)
{
if(s.top-s.base>=s.stacksize)
{
s.base=(SElemType*)realloc(s.base,(stack_size+stackincrement)*sizeof(SElemType));
if(!s.base) exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=stackincrement;
}
*s.top++=e;
return OK;
}
status Pop(SqStack &s,SElemType &e)
{
if(s.top==s.base)
return ERROR;
e=*--s.top;
return OK;
}
bool In(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='#'||c=='('||c==')')
return TRUE;
else
return FLASE;
}
int LocateChar(char c)
{ int k;
switch(c)
{ case '+': k=0;break;
case '-': k=1;break;
case '*': k=2;break;
case '/': k=3;break;
case '(': k=4;break;
case ')': k=5;break;
case '#': k=6;break;
}
return k;
}
char Precede(char c1, char c2)
{ int i,j;
char P[7][7]={{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','$'},
{'>','>','>','>','$','>','>'},
{'<','<','<','<','<','$','='}};
i=LocateChar(c1);
j=LocateChar(c2);
if(P[i][j]=='$')
exit(-1);
//{printf("算符不匹配!输入错误\n");exit(-1);}
return P[i][j];
}
SElemType Operate(SElemType a,SElemType ch,SElemType b)
{
char c=char(ch);
if(c=='*')
return (a*b);
else if(c=='/'&&b!=0)
return (a/b);
else if(c=='+')
return (a+b);
else if(c=='-')
return (a-b);
else
{
printf("ERROR!\n");
exit(-1);
}
}
SElemType EvaluateExpression()
{
SqStack OPTR,OPND;//设OPTR为运算符栈,OPND为运算数栈
char c;
char data[11];
SElemType a,b,d,e;
InitStack(OPTR);
InitStack(OPND);
Push(OPTR,'#');
c=getchar();
Gettop(OPTR,e);
while(c!='#'||e!='#')
{
if(In(c))
{
switch(Precede(e,c))
{
case'<':
Push(OPTR,c);
c=getchar();
break;
case'=':
Pop(OPTR,e);
c=getchar();
break;
case'>':
Pop(OPND,b);
Pop(OPND,a);
Pop(OPTR,e);
Push(OPND,Operate(a,e,b));
break;
}//switch
}//if
else if(c>='0'&&c<='9'||c=='.')
{
int i=0;
while(c>='0'&&c<='9'||c=='.')
{
data[i]=c;
i++;
c=getchar();
}
data[i]='\0';//数字没有存满,输入字符串结束符
d=atof(data);//此处是把数组里的数字,实际上是按字符串;转换为double类型,然后把浮点型数字入栈
Push(OPND,d);//atof函数的形参是指针类型,故用数组名
}
else
{
printf("input ERROR!\n");
exit(-1);
}
Gettop(OPTR,e);
}
Gettop(OPND,e);
return e;
}
int main()
{
SElemType a;
printf("please input the expression ,and end in'#':\n");
a=EvaluateExpression();
printf("%f\n",a);
return 0;
#include<stdlib.h>
#include<process.h>
#define TRUE 1
#define FLASE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define stack_size 100
#define stackincrement 10
typedef int status;
typedef float SElemType;
typedef struct SNode{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
status InitStack(SqStack &s)
{//栈的初始化,建立一个空栈
s.base=(SElemType*)malloc(stack_size*sizeof(SElemType));
if(!s.base) exit(OVERFLOW);
s.top=s.base;
s.stacksize=stack_size;
}
status Gettop(SqStack s,SElemType &e)
{
if(s.top==s.base)
return ERROR;
e=*(s.top-1);
return OK;
}
status Push(SqStack &s,SElemType e)
{
if(s.top-s.base>=s.stacksize)
{
s.base=(SElemType*)realloc(s.base,(stack_size+stackincrement)*sizeof(SElemType));
if(!s.base) exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=stackincrement;
}
*s.top++=e;
return OK;
}
status Pop(SqStack &s,SElemType &e)
{
if(s.top==s.base)
return ERROR;
e=*--s.top;
return OK;
}
bool In(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='#'||c=='('||c==')')
return TRUE;
else
return FLASE;
}
int LocateChar(char c)
{ int k;
switch(c)
{ case '+': k=0;break;
case '-': k=1;break;
case '*': k=2;break;
case '/': k=3;break;
case '(': k=4;break;
case ')': k=5;break;
case '#': k=6;break;
}
return k;
}
char Precede(char c1, char c2)
{ int i,j;
char P[7][7]={{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','$'},
{'>','>','>','>','$','>','>'},
{'<','<','<','<','<','$','='}};
i=LocateChar(c1);
j=LocateChar(c2);
if(P[i][j]=='$')
exit(-1);
//{printf("算符不匹配!输入错误\n");exit(-1);}
return P[i][j];
}
SElemType Operate(SElemType a,SElemType ch,SElemType b)
{
char c=char(ch);
if(c=='*')
return (a*b);
else if(c=='/'&&b!=0)
return (a/b);
else if(c=='+')
return (a+b);
else if(c=='-')
return (a-b);
else
{
printf("ERROR!\n");
exit(-1);
}
}
SElemType EvaluateExpression()
{
SqStack OPTR,OPND;//设OPTR为运算符栈,OPND为运算数栈
char c;
char data[11];
SElemType a,b,d,e;
InitStack(OPTR);
InitStack(OPND);
Push(OPTR,'#');
c=getchar();
Gettop(OPTR,e);
while(c!='#'||e!='#')
{
if(In(c))
{
switch(Precede(e,c))
{
case'<':
Push(OPTR,c);
c=getchar();
break;
case'=':
Pop(OPTR,e);
c=getchar();
break;
case'>':
Pop(OPND,b);
Pop(OPND,a);
Pop(OPTR,e);
Push(OPND,Operate(a,e,b));
break;
}//switch
}//if
else if(c>='0'&&c<='9'||c=='.')
{
int i=0;
while(c>='0'&&c<='9'||c=='.')
{
data[i]=c;
i++;
c=getchar();
}
data[i]='\0';//数字没有存满,输入字符串结束符
d=atof(data);//此处是把数组里的数字,实际上是按字符串;转换为double类型,然后把浮点型数字入栈
Push(OPND,d);//atof函数的形参是指针类型,故用数组名
}
else
{
printf("input ERROR!\n");
exit(-1);
}
Gettop(OPTR,e);
}
Gettop(OPND,e);
return e;
}
int main()
{
SElemType a;
printf("please input the expression ,and end in'#':\n");
a=EvaluateExpression();
printf("%f\n",a);
return 0;
}
//------------------自己真是太粗心了,写函数时,有时候会忘记写分号,忘了函数值返回值