64,677
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 10
#define STACK_INCREMENTE 10
typedef char ElemType1;
typedef int ElemType2;
typedef struct{ //OPTR栈的结构
ElemType1 *base;
ElemType1 *top;
int stacksize;
}SqStack1;
typedef struct{ //OPND栈的结构
ElemType2 *base;
ElemType2 *top;
int stacksize;
}SqStack2;
int InitStack1(SqStack1 &S){ //初始化OPTR
S.base=(ElemType1 *)malloc(STACK_INIT_SIZE*sizeof(ElemType1)); //expected')'before';'token(错误)
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
int Push1(SqStack1 &S,ElemType1 e){ //OPTR入栈
if(S.top-S.base>=S.stacksize){
S.base=(ElemType1 *)realloc(S.base,(S.stacksize+STACK_INCREMENTE)*sizeof(ElemType1)); // expected')'before';'token
if(!S.base) exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize=S.stacksize+STACK_INCREMENTE;
}
*S.top++=e;
return OK;
}
/* 需要传地址, 所有e也应该用引用*/
int Pop1(SqStack1 &S,ElemType1 &e)
{ //OPTR出栈
if(S.base==S.top)
return ERROR;
e = *--S.top;
return OK;
}
ElemType1 GetTop1(SqStack1 S)
{ //OPTR取栈顶元素
if(S.base==S.top)
return ERROR;
ElemType1 e;
e=*(S.top-1);
return e;
}
int InitStack2(SqStack2 &S)
{ //初始化OPND
S.base=(ElemType2 *)malloc(STACK_INIT_SIZE*sizeof(ElemType2));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
int Push2(SqStack2 &S,ElemType2 e)
{ //OPND入栈
if(S.top-S.base>=S.stacksize){
S.base=(ElemType2 *)realloc(S.base,(S.stacksize+STACK_INCREMENTE)*sizeof(ElemType2));
if(!S.base) exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize=S.stacksize+STACK_INCREMENTE;
}
*S.top++=e;
return OK;
}
/* 需要传地址, 所有e也应该用引用*/
int Pop2(SqStack2 &S,ElemType2 &e)
{ //OPND出栈
if(S.base==S.top) return ERROR;
e=*--S.top;
return OK;
}
ElemType2 GetTop2(SqStack2 S){ //OPND取栈顶元素
if(S.base==S.top) return ERROR;
ElemType2 e;
e=*(S.top-1);
return e;
}
int IN(char c)
{
/* 最后#做什么?是不是缺少c == 呢*/
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='^'||c=='('||c==')'||c == '#')
return 1;
else return 0;
}
char Precede(char d,char c)
{
switch(c){
case'+':switch(d)
{
case'+':return '>';break;
case'-':return '>';break;
case'*':return '>';break;
case'/':return '>';break;
case'^':return '>';break;
case'(':return '<';break;
case')':return '>';break;
case'#':return '<';break;
}
case'-':switch(d)
{
case'+':return '>';break;
case'-':return '>';break;
case'*':return '>';break;
case'/':return '>';break;
case'^':return '>';break;
case'(':return '<';break;
case')':return '>';break;
case'#':return '<';break;
}
case'*':switch(d)
{
case'+':return '<';break;
case'-':return '<';break;
case'*':return '>';break;
case'/':return '>';break;
case'^':return '>';break;
case'(':return '<';break;
case')':return '>';break;
case'#':return '<';break;
}
case'/':switch(d)
{
case'+':return '<';break;
case'-':return '<';break;
case'*':return '>';break;
case'/':return '>';break;
case'^':return '>';break;
case'(':return '<';break;
case')':return '>';break;
case'#':return '<';break;
}
case'^':switch(d)
{
case'+':return '<';break;
case'-':return '<';break;
case'*':return '<';break;
case'/':return '<';break;
case'^':return '>';break;
case'(':return '<';break;
case')':return '>';break;
case'#':return '<';break;
}
case'(':switch(d)
{
case'+':return '<';break;
case'-':return '<';break;
case'*':return '<';break;
case'/':return '<';break;
case'^':return '<';break;
case'(':return '<';break;
case'#':return '<';break;
}
case')':switch(d)
{
case'+':return '>';break;
case'-':return '>';break;
case'*':return '>';break;
case'/':return '>';break;
case'^':return '>';break;
case'(':return '=';break;
case')':return '>';break;
}
case'#':switch(d)
{
case'+':return '>';break;
case'-':return '>';break;
case'*':return '>';break;
case'/':return '>';break;
case'^':return '>';break;
case')':return '>';break;
case'#':return '=';break;
}
}
}
ElemType2 Operate(int a,char theta,int b)
{
switch(theta)
{ //break!!!!
case'+':return(a+b);
case'-':return (a-b);
case'*':return (a*b);
case'/':return (a/b);
case'^':return (pow(a,b));
}
return OK;
}
int EvaluateExpression(){
SqStack1 OPTR;
SqStack2 OPND;
InitStack1(OPTR);
InitStack2(OPND);
char c,theta;
int num,a,b;
c=getchar();
Push1(OPTR,'#');
while(c!='#'||GetTop1(OPTR)!='#'){
if(!IN(c)){
while(!IN(c))
{
num*=10;
num+=(c-48);
c=getchar();
}
Push2(OPND,num);} //num='c'-48
else
{
switch(Precede(GetTop1(OPTR),c))
{
case'<':Push1(OPTR,c);c=getchar();break;
case'=':Pop1(OPTR,c);c=getchar();break;
case'>':Pop1(OPTR,theta); //theta=GetTop1(OPTR)
Pop2(OPND,b);Pop2(OPND,a);
Push2(OPND,Operate(a,theta,b));break;
}
}
}
return GetTop2(OPND);
}
int main()
{
printf("请输入要计算的表达式:\n");
int m;
m=EvaluateExpression();
printf("%d",m);
return 0;
}
问题:
1. 宏定义不需要加分号;
2. Pop1和Pop2函数中,第二个参数都应该传地址,所以应该用&引用
3. 程序里还有其他问题,建议详见上面的代码注释