LeaveDark 2017年09月12日
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]的语句啊 很是不解。。。。注释自己加的不要眼花。。。。
...全文
150 点赞 收藏 6
写回复
6 条回复

还没有回复,快来抢沙发~

发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告