作为栈的初学者,表达式求值的问题给我带来了非常多的思考。目前,我还只能实现非负整数的带加减乘除模及括号运算的表达式求值,且效率也不算高。但还是想记录一下这个问题实现的整个过程。
我们平常习惯的表达式称为中缀表达式,是语法树中序遍历的结果,这样用计算机来计算并不容易,特别是遇到括号中还有很多括号的情况。也就是说,我们面对的最大的问题是,当不知道有多少个优先级需要判断时,我们到底该怎么办呢?前人真的非常的聪明,想到转换成后缀表达式进行求值,而这个转换的过程让我颇有受益。
在所有问题之前,我们先确定符号的优先级。
int priority(char op){
if(op == '+' || op == '-') return 1;
else if(op == '*' || op == '/' || op == '%') return 2;
else return 0;
}//运算符优先级。
接下来我们先实现中缀表达式到后缀表达式的转换。
创建
char* op = (char*)malloc(sizeof(char)*1000000);
char** RPN = (char**)malloc(sizeof(char*)*1000000);
int i = 0, j = 0, k, t = 0, top = -1;//op为我们储存符号的栈,RPN为我们要转换成的逆波兰表达式。
对所有可能遇到的字符进行处理
if(s[k] == 32) continue;//说明:s为传入的表达式字符串,k为已经遍历到的第k位字符。
//如果是空格我们直接跳过。
else if(s[k] &g