利用栈来完成表达式求值
一个表达式要求值,分为操作数部分和运算符部分,求值的过程便是运算符对操作数进行操作。
首先我们定义两个栈,一个栈存放运算符,先放个#进去,代表开始,然后记得结束最后一个字符也是#,这样代表结束。然后建立一个栈存放操作数。
算法:
定义一个字符来getchar字符,然后判断。首先判断这是字符是不是#或者现在运算符栈的top是不是#,如果两个都是#那么运算完成。
然后判断,不是运算符的话就存入操作数栈内
如果是运算符,那么判断,这个运算符与现在运算符栈top位置的运算符的关系,两者的优先性,根据优先性来进行下一步操作
比如top位置是‘-‘,然后字符是‘)’,那么在运算符栈内肯定有一个“(”与字符‘)’对应,如果没有,那么肯定输入有问题。因为有’(‘在栈内所以‘-’的优先性是大于‘)’的,获得字符‘>’所以进行运算,也就是减。首先从操作数里面取top出来,作为减数,然后top–,然后再取top作为被减数,因为存放顺序的关系,先进去的肯定是在前面。然后在字符“>”的情况下是不进行getchar的,因为也就进行了运算,所以现在字符还是‘)’,然后现在运算符栈内的就是‘(’,如果不是,那么继续运算,因为可能出现(7+2+2)这种,那么多算一次‘>’的情况就行。然后(与)判断结果是=,让运算符栈内(消掉,然后现在括号内的运算已经完毕,然后getchar获取下一个字符,继续进行判断!
代码可以直接运行
#include"consts.h"
typedef struct {
char S[100];
int top;
}CHARStack;
void InitStack(CHARStack *S) {
S->top = -1;
}
void Push(CHARStack* S, char ch) {
if (S->top >= 99) {
printf("栈满!\n");
exit(0);
}
else {
S->top++;
S->S[S->top] = ch;
}
}
char GetTop(CHARStack* S) {
if (S->top==-1) {
printf("栈空!\n");
exit(0);
}
else {
return S->S[S->top];
}
}
int TRIn(char ch) {
//是运算符就返回1,不是运算符返回0
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