表达式求值问题,其中运算符号只包含 加减乘除 取整数 详细请参见代码:
#include <stdio.h> #define MAX_SIZE 100 typedef struct { int top; char data[MAX_SIZE]; }NumStack; typedef struct { int top; char opera[MAX_SIZE]; }OperaStack; const char perior[5][5] = { '>','>','<',}; void NumPush(NumStack* L,int elem); void OperaPush(OperaStack* L,char elem); int NumPop(NumStack* L); char OperaPop(OperaStack* L); char comp_perior(char a,char b); int compute(int a,int b,char c); int pe2int(char a); void main() { int i = 0; int j = 0; int num = 0; char expression[20] = "14+13-2*9+24/3="; NumStack Num_stack = {0,}; OperaStack Opera_stack = {0,}; while (expression[i] != '\0') { switch (expression[i]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': num = 10*num + (expression[i]-'0'); break; case '=': if (expression[i+1] != '\0') return; case '+': case '-': case '*': case '/': NumPush(&Num_stack,num); if (Opera_stack.top == 0 || comp_perior(Opera_stack.opera[Opera_stack.top-1],expression[i]) == '<') OperaPush(&Opera_stack,expression[i]); // 栈空时直接入栈 else { do { int temp = compute(NumPop(&Num_stack),NumPop(&Num_stack),OperaPop(&Opera_stack)); NumPush(&Num_stack,temp); }while (comp_perior(Opera_stack.opera[Opera_stack.top-1],expression[i]) == '>'); OperaPush(&Opera_stack,expression[i]); } num = 0; break; } i++; } printf("计算的结果 = %d\n",Num_stack.data[Num_stack.top-1]); } void NumPush(NumStack* L,int elem) { if (L->top+1 < MAX_SIZE) L->data[L->top++] = elem; } void OperaPush(OperaStack* L,char elem) { if ((L->top+1) < MAX_SIZE) L->opera[L->top++] = elem; } int NumPop(NumStack* L) { if (L->top == 0) return -1; return (L->data[--L->top]); } char OperaPop(OperaStack* L) { if (L->top == 0) return -1; return (L->opera[--L->top]); } char comp_perior(char a,char b) { return perior[pe2int(a)][pe2int(b)]; } int pe2int(char a) { switch (a) { case '+': return 0; case '-': return 1; case '*': return 2; case '/': return 3; case '=': return 4; default: return -1; } } int compute(int a,char c) { switch(c) { case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。