大家看看,在(高级)或程序员教材上,这段程序是不是有错误?

air821 2002-07-06 07:13:07
在高级程序员的教材 P392,第8行起,
或 程序员的教材的 P318,第7行起,

if(type==Rp){ //将栈中‘(’退去
do if(l_pop(&dop,&optop))
synError(); //栈空出错
while((char)dop!=Lp); //连续退至‘(’
}else
l_push((double)type,&optop); //栈外运算符进栈

其中的do while 语句是连续退至‘(’,我觉得不太对。
如果连续退至‘(’,那么在 左括号 到 右括号 中的运算符不是还没有处理?
如果结合整个程序看,之后的else 语句,是什么运算符进栈??

我的水平很低,是不是我理解错了?请大家指教!!

...全文
32 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaocuo_zrf 2002-07-09
  • 打赏
  • 举报
回复
亲爱的老实和尚,这不是一处错误,
当扫描得到“)”他的栈外优先级是低于栈内的其他操作符的〈除了栈内操作符为为“(”〉,
<请参见P389页的int osp[]={5,3,3,2,2,5,1,1};isp[]={4,3,3,2,2,0};进行对比>
那么请看到P391页的倒数第6行的那个循环,
while(osp[type-1]<=isp[(int)optop->data-1]&&optop->data<=5)
{..........
..........
对应操作数运算符出栈
并进行运算
中间结果压栈
..........
}
if(type==END) break
if(type==RP)
{
.........
.........
}

根据那个循环的条件,当扫描得到的是“)”后,因为“)”的
栈外优先级是低于栈内的操作符的优先级的〈除非栈内是“(”〉
因此,执行循环内的相应操作〈对应操作数、运算符出栈,进行运算,
中间结果压栈 〉然后又回到循环开头继续判断,而不是执行到下面的if,
一直要到这两个括号之间的运算符全部出栈了,运算完成了才会执行到下面的
If(type==end)break; if(type=Rp){......所以,你说说的 "左括号 到 右括号
中的运算符"其实出了循环就运算完毕了。这段程序是应为翻了页所以你没有注意到if 的判断和
循环并不在一个{ } 里所以才会有这样的认为,其实把
if(type==Rp){
do if(l_pop(&dop,&optop))
synError();
while((char)dop!=Lp);
}else
l_push((double)type,&optop);


改成 if(l_pop(&dop,&optop))
synError();
else
l_push((double)type,&optop); //栈外运算符进栈

程序也能照样运行!
如果我有什么说错的mail给我,很高兴能和你探讨 xiaocuo_zrf@hotmail.com




2,958

社区成员

发帖
与我相关
我的任务
社区描述
就计算机等级考试、软件初、中、高级不同级别资格考试相关话题交流经验,共享资源。
c1认证c4javac4前端 技术论坛(原bbs)
社区管理员
  • 软件水平考试社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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