关于使用逆波兰式处理简单的数字表达式
表达式类似 ( 2 ∗ 5 + ( 3 + 7 ) ) ∗ 8 (2*5+(3+7))*8 (2∗5+(3+7))∗8
今天写了一下午,一开始想得是使用二叉树把表达式存起来,但是做了大概四五个小时,搞到半夜两点多,发现代码写起来很复杂,于是没忍住查了一下,百度上写得很明白,使用逆波兰式可以使计算变得很简单,逆波兰式其实也就是二叉树的后序遍历,所以花了点时间,写出了一个将表达式转换成逆波兰式的程序:
上面的字符串经过处理的结果是: 25 ∗ 37 + + 8 ∗ 25*37++8* 25∗37++8∗
程序中为了方便处理,在末尾加入了#,后续处理将#号去掉即可。
这个程序有几点问题:只能处理较为简单的四则运算,只能处理0-9的数字,而且无法处理字母,所以下一步要修改程序,解决以上的问题。
MStringExpTree::MStringExpTree(QString str)
{
QStack<QChar> RPN;
QStack<QChar> theOperators;
theOperators.push('#');
str.push_back('#');
for(int i=0;i<str.size();i++){
QChar temp = str.at(i);
if(isNumber(temp))
RPN.push(temp);
if(temp == '(')
theOperators.push(temp);
if(temp == ')'){
while (theOperators.top() !='(') {
RPN.push(theOperators.pop());
}
theOperators.pop();
}
if(isOperator(temp)){
if(higherThan(temp,theOperators.top()))
theOperators.push(temp);
else{
RPN.push(theOperators.pop());
while (lowerThan(temp,theOperators.top())) {
RPN.push(theOperators.pop());
}
theOperators.push(temp);
}
}
if(temp == '#'){
while (!theOperators.isEmpty()) {
temp = theOperators.pop();
RPN.push(temp);
}
}
}
}