c++ 数据结构 利用顺序栈实现多项式的中缀转后缀

      表达式中缀转后缀:中缀表达式的计算,相邻两个运算符优先级高的先运算;优先级相同,从左到右依次计算;   要实现中缀转后缀,中心思想就是先运算的运算符先从栈内输出。(后缀表达式与中缀表达式的联系可参考我的另一篇博客http://blog.csdn.net/sinat_34927324/article/details/53244380)

1.中缀转后缀的算法

   (1)操作符栈初始化,将结束符#进栈。然后读入中缀表达式字符流的首字符ch。

   (2)重复执行以下步骤,知道ch='#',同时栈顶的操作符也是#,停止循环。

        1如果ch是操作数直接输出,读入下一字符

         2如果ch是操作符,判断ch的优先级icp和当前位于栈顶操作符op的isp:

             .icp(ch)>isp(op),令ch进栈,读入下一字符ch

              .icp(ch)<isp(op),op退栈,并输出

              .icp(ch)=isp(op),退栈但不输出,如果op='(',读入下一字符

      (3) 算法结束,输出序列即为所需的后缀表达式

2.运算符栈内栈外的优先级:


解释一下该表:

    . 相同运算符栈内栈外的优先级为什么不一样?

     相同优先级的运算符进栈后优先级加一是为了实现同级别运算符从左到右依次运算。(相邻两级别相同的运算符左边的运算符先输出)

      比如计算表达式:A+B-C#,先计算的是+运算,后计算的是-运算,从左向右扫描该表达式,操作数A直接输出,然后icp(+)>isp(#),+进栈,然后扫描到B,输出,然后扫描到-,因为+进栈后优先级加一,所以isp(+)>icp(-),+才能出栈并输出,然后icp(-)>isp(#),-进栈,然后扫描到c,输出,然后扫描到#,isp(-)>icp(#),-出栈并输出,最后得到后缀表达式AB+C-。( *,/,%也是同理)

   .为什么*/%的栈外优先级大于+ - 的栈内优先级?

     这是因为*/%的优先级大于+ -的优先级,优先级高的先运算也就先输出。

    比如计算A-B*C# ,从左到右扫描该表达式,A是操作数,输出,读下一字符;icp(-)>isp(#),进栈,并扫描下一操作符;B操作数,输出并读下一字符;此时icp(*)>isp(-),*才能进栈,才能阻止-先输出(即先运算),如此得到的后缀表达式才是ABC*-。如果icp(*)<isp(-),的话,得到的后缀表达式就是AB-C* 了,就不符合优先级高的运算符先运算了。

    .(站外优先级最高,为啥一进栈优先级就变最低了?

      因为要实现括号内的表达式先运算,就得保证括号内的运算符先输出,让(进栈后优先级最低,才能保证括号内的运算符顺利进栈,然后扫描完括号内的表达式后扫描到),其优先级最低,使括号内的运算符输出。

    如A+B(C-D)-E/F,扫描A 输出扫描+,进栈;扫描B输出;扫描(,进栈,进栈后优先级变为最低(扫描C,输出)扫描-,栈外优先级自然高于(的栈内优先级,所以-进栈,D输出后扫描到),isp(-)>icp()),-得以先输出。

    .#的栈内栈外优先级都为最低: # 的栈内优先级最低,是为了扫描开始时运算符顺利进栈。# 的栈外优先级最低,是为了扫描完表达式后扫描到最后一个字符#后,让栈内剩余的运算符顺利输出。

 3.算法细化:

   

  1.头文件:

   优先级头文件:

  

 2.顺序表头文件:


3.中缀转后缀头文件:


二.源文件

1.中缀转后缀:



顺序栈:(在我另一篇博客可见,此处不再贴出:http://blog.csdn.net/sinat_34927324/article/details/53191631)


mian函数:调用中缀转后缀的函数



 


 

 

  

  



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值