#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -1
char *op = "+-*/()#";
char opt[8][8] = {
">><<<>>",
">><<<>>",
">>>><>>",
">>>><>>",
"<<<<<=@",
">>>>@>>",
"<<<<<@="
};
typedef struct {
int *base;
int *top;
int stacksize;
}SqStack;
int InitStack(SqStack &s) {
s.base = (int *)malloc(30 * sizeof(int));
if (!s.base) exit(OVERFLOW);
s.top = s.base;
s.stacksize = 30;
return OK;
}
int GetTop(SqStack &s) {
int e;
if (s.top == s.base) return ERROR;
e = *(s.top - 1);
return e;
}
int Push(SqStack &s, int e) {
if (s.top - s.base >= s.stacksize) {
s.base = (int *)realloc(s.base, (s.stacksize + 10) * sizeof(int));
if (!s.base) exit(OVERFLOW);
s.top = s.base + s.stacksize;
s.stacksize += 10;
}
*s.top++ = e;
return OK;
}
int Pop(SqStack &s, int &e) {
if (s.top == s.base) return ERROR;
e = *--s.top;
return OK;
}
int In(int c)
{
if (c >= 48 && c <= 57)
return 1;
else return 0;
}
char Precede(char t1, char t2) {
char *p1, *p2;
p1 = strchr(op, t1);
p2 = strchr(op, t2);
return (opt[p1 - op][p2 - op]);
}
int Operate(int a, char theta, int b)
{
if (theta == '+') return (a + b);
else if (theta == '-') return (a - b);
else if (theta == '/') return (a / b);
else if (theta == '*') return (a * b);
else return ERROR;
}
int EvaluateExpression() {
SqStack OPTR, OPND;
InitStack(OPTR);
InitStack(OPND);
Push(OPTR, '#');
int theta;
int x, a, b;
char c = getchar();
while (c != '#' || GetTop(OPTR) != '#') { //OPTR 运算符的栈
if (In(c)) { //OPND 数字的栈
Push(OPND, c - 48);
c = getchar(); //是数字就进栈
}
else {
switch (Precede(GetTop(OPTR), c)) {
case'<':
Push(OPTR, c);
c = getchar();
break;
case'=':
Pop(OPTR, x);
c = getchar();
break;
case'>':
Pop(OPTR, theta);
Pop(OPND, b); Pop(OPND, a);
Push(OPND, Operate(a, theta, b));
break;
}
}
}
return GetTop(OPND);
}
int main(void)
{
int answer;
printf("输入表达式\n");
answer = EvaluateExpression();
printf("结果 :%d\n", answer);
return 0;
}
表达式求值
最新推荐文章于 2022-11-09 10:25:35 发布