c++初学者实现中缀表达式转换为后缀表达式遇到问题

LeaveDark 2017-09-12 08:03:21

先贴上代码 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]的语句啊 很是不解。。。。注释自己加的不要眼花。。。。
...全文
334 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2017-09-19
  • 打赏
  • 举报
回复
引用 3 楼 qq_33729279 的回复:
引用 2楼paschen 的回复:
因为i在循环时不断变量,所以s[i] 随i变化是不同的值
是我没说清楚吧 这是一个遍历 当si等于-时才执行case-的语句 那说明i在case-才执行的语句中是不会变得 那又何来后面红色语句的判断呢
switch (S[i]) 判断时 S[i] 与while每次循环判断的S[i] 未必是同一个,因为你循环中是会改变i的值的
LeaveDark 2017-09-13
  • 打赏
  • 举报
回复
引用 4楼赵4老师 的回复:
百度搜相关关键字。
Switch 吗 这个我知道啊 但是case-后面的语句的前提就是si是减号的时候啊 为什么后面还要判断大于等于0之类的 这不是矛盾吗
赵4老师 2017-09-13
  • 打赏
  • 举报
回复
百度搜相关关键字。
LeaveDark 2017-09-13
  • 打赏
  • 举报
回复
引用 2楼paschen 的回复:
因为i在循环时不断变量,所以s[i] 随i变化是不同的值
是我没说清楚吧 这是一个遍历 当si等于-时才执行case-的语句 那说明i在case-才执行的语句中是不会变得 那又何来后面红色语句的判断呢
paschen 版主 2017-09-13
  • 打赏
  • 举报
回复
因为i在循环时不断变量,所以s[i] 随i变化是不同的值
LeaveDark 2017-09-12
  • 打赏
  • 举报
回复
顶下
内容概要:本文档介绍了南京邮电大学离散数学实验一,重点在于利用真值表法求取主析取范式和主合取范式。实验首先将中缀表达式转换后缀表达式,使用栈结构处理运算符和操作数。然后,通过递归枚举所有可能的赋值情况,计算每个赋值情况下的后缀表达式的真假值,并分别记录真值为真的情况到`tr`数组和假的情况到`flase`数组。最后,根据`tr`和`flase`数组输出主析取范式和主合取范式。实验过程中使用了C++语言,涉及字符串处理、栈操作、递归枚举等技术。 适合人群:计算机科学或相关专业学生,特别是对离散数学和逻辑运算有兴趣的学习者,以及需要掌握逻辑表达式求解方法的研究人员。 使用场景及目标:①帮助学生理解逻辑表达式的转换和求解过程;②掌握中缀表达式后缀表达式的算法;③通过递归枚举和栈操作实现逻辑表达式的真假值计算;④学习并应用主析取范式和主合取范式的概念。 其他说明:该实验不仅涵盖了理论知识的应用,还提供了完整的C++代码实现,便于读者理解和实践。实验中使用了多种数据结构如栈、队列、向量和映射,有助于提高编程能力。此外,实验代码提供了详细的注释,有助于初学者逐步理解每个步骤的具体实现

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧