#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
typedef struct {
char *base;
char *top;
int stacksize;
} stack; //字符栈
int InitStack(stack *s) { //初始化栈
s->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));
if (!s->base) {
exit(1);
} else {
s->top = s->base;
s->stacksize = STACK_INIT_SIZE;
}
}
char GetTop(stack *s) { //用e返回栈顶元素
if (s->base == s->top) {
printf("栈已空/n");
} else {
return(*(s->top - 1));
}
}
void Pop(stack *s, char *e) { //返回栈顶元素,注意此处e的值需要改变,因该使用指针
if (s->base == s->top) {
printf("栈已空/n");
} else {
*e = *--s->top;
}
}
int Push(stack *s, char e) { //将e入栈
if (s->top - s->base >= s->stacksize) {
s->base = (char *)realloc(s->base, (s->stacksize + STACK_INCREMENT) * sizeof(char));
if (!s->base) {
exit(1);
} else {
s->top = s->base + s->stacksize;
s->stacksize += STACK_INCREMENT;
}
} else {
*s->top++ = e;
}
}
char JudgePrecede(char symbol1, char symbol2) {
//优先级判断算法
char pre[7][7] = {{'>', '>', '<', '<', '<', '>', '>'}, //运算符优先级设置有二维数组完成
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'<', '<', '<', '<', '<', '=', ' '},
{'>', '>', '>', '>', ' ', '>', '>'},
{'<', '<', '<', '<', '<', ' ', '='}
} ;
int row, line;
switch (symbol1) {
case '+':
row = 0;
break;
case '-':
row = 1;
break;
case '*':
row = 2;
break;
case '/':
row = 3;
break;
case '(':
row = 4;
break;
case ')':
row = 5;
break;
case '#':
row = 6;
break;
default:
break;
}
switch (symbol2) {
case '+':
line = 0;
break;
case '-':
line = 1;
break;
case '*':
line = 2;
break;
case '/':
line = 3;
break;
case '(':
line = 4;
break;
case ')':
line = 5;
break;
case '#':
line = 6;
break;
default:
break;
}
return(pre[row][line]);
}
int IfOperator(char c) {
//判断c是否为运算符
if (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' || c == '#') {
return(1);
} else {
return(0);
}
}
char Operation(char operand1, char operator, char operand2) {
//四则运算
switch (operator) {
case '+':
return(operand1 + operand2 - '0'); //0的ASC2为048
break;
case '-':
return(operand1 - operand2 + '0');
break;
case '*':
return((operand1 - '0') * (operand2 - '0') + '0');
break;
case '/':
return((operand1 - '0') / (operand2 - '0') + '0');
break;
default:
break;
}
}
void EvaluateExpression(char *e) {
//算法描述,以#结尾,用e返回表达式的值
stack OPND; //OPTR为运算符栈,OPND为操作数栈
stack OPTR;
InitStack(&OPTR);
InitStack(&OPND);
Push(&OPTR, '#');
char operator, a, b, c;
c = getchar();
while (c != '#' || GetTop(&OPTR) != '#') {
if (!IfOperator(c)) {
Push(&OPND, c);
c = getchar();
} else {
switch (JudgePrecede(GetTop(&OPTR), c)) {
case '<':
Push(&OPTR, c);
c = getchar();
break;
case '=':
Pop(&OPTR, &operator);
c = getchar();
break;
case '>':
Pop(&OPTR, &operator);
Pop(&OPND, &b);
Pop(&OPND, &a);
Push(&OPND, Operation(a, operator, b));
break;
default:
break;
}
}
}
*e = GetTop(&OPND);
}
main(){
printf("输入一条表达式,以'#'结尾,回车/n");
char e;
EvaluateExpression(&e);
printf("%d/n", e - '0');
system("pause");
}