c++初学者实现中缀表达式转换为后缀表达式遇到问题
先贴上代码 QT开发环境
int Change(const char *S,char NUM[],int &len)//中缀表达式转后缀表达式
{
QStack<char> OP;
int i,j=0;
for (i = 0; i < strlen(S); i++)
{
switch (S[i])
{
case'+':
if(OP.isEmpty())
OP.push(S[i]);
else if (OP.top() == '*' || OP.top() == '/')//如果栈顶的运算符优先级比+高
{
NUM[j++] = OP.pop();//将优先级高的运算符出栈
i--;//目的是继续比较加号与OP栈中剩下的操作符的优先级的高低
}
else
OP.push(S[i]);
break;
case'-':
if('('!=S[i-1]&&0!=i)//如果负号前面不是左括号且符号不是表达式第一个元素
{
if(OP.isEmpty())//如果负号前面不是左括号且符号不是表达式第一个元素+如果存放运算符的栈是空的
{
OP.push(S[i]);
}//把符号压进OP栈中
else if (OP.top() == '*' || OP.top() == '/')//如果负号前面不是左括号且符号不是表达式第一个元素+若OP不空+栈中顶元素是乘号或除号
{
NUM[j++] = OP.pop();//将OP栈中顶元素赋值给输出的字符数组,NUM数组往后移一位
i--;
}
else//如果负号前面不是左括号且符号不是表达式第一个元素+若OP不空+栈中顶元素不是乘号或除号
{
OP.push(S[i]);
}
}
else//当减号是表达式的首元素e:-13+5或者减号当负号用时eg:1+(-4)
{
while ((S[i] >= '0'&&S[i] <= '9' )|| S[i] == '.'||('-'==S[i]&&(S[i-1]<'0'||S[i-1]>'9')))
{
NUM[j++] = S[i];
if('-'==S[i])
NUM[j++]='@';
i++;
}
i--;
NUM[j++] = '#'; //数字中的间隔符
}
break;
case'*':
OP.push(S[i]);
break;
case'/':
OP.push(S[i]);
break;
case'(':
OP.push(S[i]);
break;
case')':
while (OP.top() != '(')
{
NUM[j++] = OP.pop();//出栈直到遇到第一个(
}
OP.pop();//(出栈
break;
default:
while (S[i] >= '0'&&S[i] <= '9' || S[i] == '.'||('-'==S[i]&&S[i-1]<'0'&&S[i-1]>'9'))//0-9数字或者.或者
{
NUM[j++] = S[i];
i++;//amazing~
}
i--;//amazing~
NUM[j++] = '#'; //间隔符,如果遍历到数字,进入NUM后在其后面加一个#确保多位数在后面运算时会被识别
break;
}
}
while (!OP.isEmpty())
{
NUM[j++] = OP.pop();//当遍历完成后OP栈中还有运算符的话就让运算符全部出栈,进入后缀表达式
}
len = j;//len即为后缀表达式的长度
return 0;
}
遍历存放表达式的s[i],问题出在case‘-’时,既然都已经是'-'这种情况了,为什么下面下划线红色代码还要有判断s[i]的语句啊 很是不解。。。。注释自己加的不要眼花。。。。
...全文
相关推荐
ExpressionEvaluation.rar_数据结构_Visual_C++_
此程序实现简单算术表达式求值功能参考了《数据结构 习题与解析 B级》
C++详解 中缀表达式转化为后缀表达式
中缀表达式转化为后缀表达式算法思想细节 首先明确什么是中缀表达式,什么是后缀表达式。 中缀表达式是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(eg:3+4)。 附:中缀表达式不易被计算机处理。 后缀表达式,又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。 转化思想: 首先明确中缀转化为后缀过程中,需要转化的部分。 其中包括加减乘除以及括号,数字的处理 括号分为左括号和右括号。左括号直接进栈
C++实现中缀表达式转后缀表达式并求值
中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。例如:(3 + 4) × 5 - 6 就是中缀表
C语言结课设计之计算器功能
主要为大家详细介绍了C语言结课设计之计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
biaodashi.rar_visual c
数据结构 表达式求解 开发环境 VC6.0


