多项式求值
定义结构体
typedef struct {
char S[100];
int top;
}CHARStack;
void InitStack(CHARStack *S) {
S->top = -1;
}
push
void Push(CHARStack* S, char ch) {
if (S->top >= 99) {
printf("栈满!\n");
exit(0);
}
else {
S->top++;
S->S[S->top] = ch;
}
}
查看顶元素
char lookding(CHARStack *S) {
if (S->top == -1) {
printf("栈空!\n");
exit(0);
} else {
return S->S[S->top];
}
}
判断运算符
int TRIn(char ch) {
if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' || ch == '#') {
return 1;
} else
return 0;
}
定义返回值
char Precede(char ch1, char ch2) {
if (ch1 == '+') {
if (ch2 == '+')
return '>';
if (ch2 == '-')
return '>';
if (ch2 == '*')
return '<';
if (ch2 == '/')
return '<';
if (ch2 == '(')
return '<';
if (ch2 == ')')
return '>';
if (ch2 == '#')
return '>';
} else if (ch1 == '-') {
if (ch2 == '+')
return '>';
if (ch2 == '-')
return '>';
if (ch2 == '*')
return '<';
if (ch2 == '/')
return '<';
if (ch2 == '(')
return '<';
if (ch2 == ')')
return '>';
if (ch2 == '#')
return '>';
} else if (ch1 == '*') {
if (ch2 == '+')
return '>';
if (ch2 == '-')
return '>';
if (ch2 == '*')
return '>';
if (ch2 == '/')
return '>';
if (ch2 == '(')
return '<';
if (ch2 == ')')
return '>';
if (ch2 == '#')
return '>';
} else if (ch1 == '/') {
if (ch2 == '+')
return '>';
if (ch2 == '-')
return '>';
if (ch2 == '*')
return '>';
if (ch2 == '/')
return '>';
if (ch2 == '(')
return '<';
if (ch2 == ')')
return '>';
if (ch2 == '#')
return '>';
} else if (ch1 == '(') {
if (ch2 == '+')
return '<';
if (ch2 == '-')
return '<';
if (ch2 == '*')
return '<';
if (ch2 == '/')
return '<';
if (ch2 == '(')
return '<';
if (ch2 == ')')
return '=';
if (ch2 == '#') {
printf("输入的多项式有误!\n");
exit(0);
}
} else if (ch1 == ')') {
if (ch2 == '+')
return '>';
if (ch2 == '-')
return '>';
if (ch2 == '*')
return '>';
if (ch2 == '/')
return '>';
if (ch2 == '(') {
printf("输入的多项式有误!\n");
exit(0);
}
if (ch2 == ')')
return '>';
if (ch2 == '#')
return '>';
} else if (ch1 == '#') {
if (ch2 == '+')
return '<';
if (ch2 == '-')
return '<';
if (ch2 == '*')
return '<';
if (ch2 == '/')
return '<';
if (ch2 == '(')
return '<';
if (ch2 == ')') {
printf("输入的多项式有误!\n");
exit(0);
}
if (ch2 == '#')
return '=';
} else {
printf("出错!");
exit(0);
return 0;
}
}
pop
void Pop(CHARStack *S, char *ch) {
if (S->top == -1) {
printf("栈空!\n");
exit(0);
} else {
*ch = S->S[S->top];
S->top--;
}
}
定义结构
int changchartonumber(char ch) {
if (ch == '0') {
return 0;
} else if (ch == '1') {
return 1;
} else if (ch == '2') {
return 2;
} else if (ch == '3') {
return 3;
} else if (ch == '4') {
return 4;
} else if (ch == '5') {
return 5;
} else if (ch == '6') {
return 6;
} else if (ch == '7') {
return 7;
} else if (ch == '8') {
return 8;
} else if (ch == '9') {
return 9;
} else {
return (int)ch;
}
}
加减乘除计算
char Operate(char ch1, char theta, char ch2) {
int c1, c2;
c1 = changchartonumber(ch1);
c2 = changchartonumber(ch2);
if (theta == '+') {
return c1 + c2;
} else if (theta == '-') {
return c1 - c2;
} else if (theta == '*') {
return c1 * c2;
} else if (theta == '/') {
return c1 / c2;
} else {
printf("错误");
exit(0);
return '0';
}
}
main
int main() {
char c, theta, a, b, xl, p;
int x;
CHARStack *OPTR, *OPND;
OPTR = (CHARStack *)malloc(sizeof(CHARStack));
OPND = (CHARStack *)malloc(sizeof(CHARStack));
InitStack(OPTR);
Push(OPTR, '#');
InitStack(OPND);
c = getchar();
while (c != '#' || lookding(OPTR) != '#') {
if (!TRIn(c)) {
Push(OPND, c);
c = getchar();
} else {
switch (Precede(GetTop(OPTR), c)) {
case'<':
Push(OPTR, c);
c = getchar();
break;
case'=':
Pop(OPTR, &p);
c = getchar();
break;
case'>':
Pop(OPTR, &theta);
Pop(OPND, &b);
Pop(OPND, &a);
Push(OPND, Operate(a, theta, b));
break;
}
}
}
printf("结果为:%d", (int)OPND->S[OPND->top]);
return 0;
}