看了浙大的数据结构视频,尝试写了这些代码
思考了一段时间得出的结果,这是得出的核心算法,表达存在一点问题可能,但是看看还是能看明白具体的逻辑,和大家分享学习交流
//目前只考虑了+-*/和()四则运算
OprandType EvaluateExpression(){ //转换为后缀表达式并计算
CreateStack(CH); //存储运算符
Push(CH,'#'); //运算结束判别符号,栈顶出现#时,运算结束
CreateStack(num); //存储运算数或运算结果
c = getchar();
//if(getTop(CH)=='#') return; 自己的错误想法
while(c != '#' || getTop(CH)!='#'){
if(!In(c,CH,num)){ //判断输入是否为运算数
Push(num,c); //入栈(num存储运算数)
c = getchar(); //接收下一字符
}
else{
switch(Precede(getTop(CH),c)){
case '<': //如果由函数Precede()判断为'<',则压入运算符栈CH
Push(CH,c); getchar();
break;
case '=':
Pop(CH,x); getchar(); //只有两个括号相遇才会被判别为'=',此时括号内的运算已经结束,取出右括号,运算继续
break;
case '>':
Pop(CH,op); Pop(num,b); Pop(num,a); Push(num,Operate(a,op,b)); c = getchar();
break; //当判别为'>'时,从栈num取出两个运算数,从栈CH取出最上面的运算符
} //调用Operate()进行计算,然后将新计算出的运算数压入栈num
}
}
return getTop(num); //运算完成,取出num中的运算数即为我们最终的结果
}
Precede(char ch,c){ //判断栈顶元素和入栈元素的优先级
ch = getTop(CH); //获取栈CH最上面的运算符
if(ch == '('){
if(c == ')') //括相相遇,返回等号
return '=';
else //栈顶元素为'('时,除了')',其余运算符都可以入栈成为新的栈顶运算符
return '<';
}
else if(ch == '+' || ch == '-'){
if(c == '+' || c == '-') //栈顶运算符和读入运算符同级时,栈顶运算符优先级大于读入运算符
return '>';
else //栈顶运算符优先级小于读入运算符,读入运算符入栈成为新的栈顶运算符
return '<';
}
else
return '>'; //当栈顶运算符为'*'或'/'时,优先级最高
}