表达式求值问题,其中运算符号只包含 加减乘除 取整数 详细请参见代码:
- #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;
- }
- }