c语言表达式的值为0,#求助帖# 数据结构 表达式求值C语言 运行结果一直为0

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#include

#include

#include

#define STACK_INIT_SIZE 100 //存储空间初始分配量

#define STACKINCREMENT 10 //存储空间分配增量

#define OK 1

#define ERROR 0

typedef struct{

char *base;

char *top;

int stacksize;

}SqStack1; //运算符栈类型定义

typedef struct{

int *base;

int *top;

int stacksize;

}SqStack2; //操作数栈类型定义

SqStack1 OPTR; //运算符栈

SqStack2 OPND; //操作数栈

int EvaluateExpression(); //计算表达式值

void OPTR_InitStack(SqStack1 *S); //运算符栈的初始化

void OPND_InitStack(SqStack2 *S); //操作数栈的初始化

char OPTR_GetTop(SqStack1 S); //取运算符栈的栈顶元素

int OPND_GetTop(SqStack2 S); //取操作数栈的栈顶元素

char OPTR_Push(SqStack1 *S, char e); //压栈

int OPND_Push(SqStack2 *S, int e); //压栈

char OPTR_Pop(SqStack1 *S, char *e); //出栈

int OPND_Pop(SqStack2 *S, int *e); //出栈

char Precede(char a, char b); //运算符优先级比较

int Operate( int d, char e,int f); //操作数d、f参加e运算的结果

int In(char c); //判断c是否是运算符

void OPTR_Init_Stack(SqStack1 *S)//运算符栈的初始化

{

(*S).base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));

if(!(*S).base) exit (OVERFLOW);//存储分配失败

(*S).top=(*S).base;

(*S).stacksize=STACK_INIT_SIZE;

}

void OPND_Init_Stack(SqStack2 *S)

{

(*S).base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));

if(!(*S).base) exit (OVERFLOW);//存储分配失败

(*S).top=(*S).base;

(*S).stacksize=STACK_INIT_SIZE;

}

char OPTR_GetTop(SqStack1 S)//取运算符栈的栈顶元素

{

if(S.top==S.base) return ERROR;

return *(S.top-1);

return OK;

}

int OPND_GetTop(SqStack2 S) //取操作数栈的栈顶元素

{

if(S.top==S.base) return ERROR;

return *(S.top-1);

return OK;

}

char OPTR_Push(SqStack1 *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(ERROR);

(*S).top=(*S).base+(*S).stacksize;

(*S).stacksize+=STACKINCREMENT;

}

*(*S).top=e;

(*S).top++;

return OK;

}

int OPND_Push(SqStack2 *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(ERROR);

(*S).top=(*S).base+(*S).stacksize;

(*S).stacksize+=STACKINCREMENT;

}

*(*S).top=e;

(*S).top++;

return OK;

}

char OPTR_Pop(SqStack1 *S, char *e) //出栈

{

if((*S).top==(*S).base) return ERROR;

*e=*--(*S).top;

return OK;

}

int OPND_Pop(SqStack2 *S, int *e) //出栈

{

if((*S).top==(*S).base) return ERROR;

*e=*--(*S).top;

return OK;

}

char Precede(char a, char b) //运算符优先级比较

{

char Op;

switch(a)

{

case '#':if(b=='#')

Op='=';

else Op='

case '+':if(b=='*' || b=='/' || b=='(' || b=='^')

Op='

else Op='>';break;

case '*':if(b=='(' || b=='^' )

Op='

else Op='>';break;

case '/':if(b=='(' || b=='^')

Op='

else Op='>';break;

case '(':if(b==')')

Op='=';

else Op='

case ')':Op='>';break;

case '^':if(b=='(')

Op='

else Op='>'; break;

}

return Op;

}

int Operate( int d, char e,int f) //操作数d、f参加e运算的结果

{

int g;

switch(e)

{

case '+':g=d+f;break;

case '-':g=d-f;break;

case '*':g=d*f;break;

case '/':g=d/f;break;

}

return g;

}

int In(char c) //判断c是否是运算符

{

if(c=='#' || c=='(' || c==')' || c=='+' || c=='-' || c=='*' || c=='/' || c=='^') return OK;

else if(c>='0' && c<='9') return OK;

else return ERROR;

}

int EvaluateExpression() //计算表达式值

{

int a,b;

char c,theta,x;

printf("请输入表达式\n");

OPTR_Init_Stack(&OPTR);OPTR_Push(&OPTR,'#');

OPND_Init_Stack(&OPND);c=getchar();

while(c!='#'||OPTR_GetTop(OPTR)!='#'){

if(!In(c))

{

OPND_Push(&OPND,(c-'0'));c=getchar();//不是运算符则进栈

}

else

switch(Precede(OPTR_GetTop(OPTR),c)){

case'

OPTR_Push(&OPTR,c);c=getchar();

break;

case'='://脱括号并接收下一字符

OPTR_Pop(&OPTR,&x);c=getchar();

break;

case'>'://退栈并将运算结果入栈

OPTR_Pop(&OPTR,&theta);

OPND_Pop(&OPND,&b);OPND_Pop(&OPND,&a);

OPND_Push(&OPND,Operate(a,theta,b));

break;

}

}

return OPND_GetTop(OPND);

}

int main()

{

int result;

result = EvaluateExpression();

printf("%d\n", result);

return OK;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值