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)

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

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

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

c++ 数据结构 利用顺序栈实现多项式的中缀转后缀_第1张图片

解释一下该表:

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

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

      比如计算表达式: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(*)

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

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

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

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

 3.算法细化:

   c++ 数据结构 利用顺序栈实现多项式的中缀转后缀_第2张图片

  1.头文件:

   优先级头文件:

  c++ 数据结构 利用顺序栈实现多项式的中缀转后缀_第3张图片

 2.顺序表头文件:

c++ 数据结构 利用顺序栈实现多项式的中缀转后缀_第4张图片

3.中缀转后缀头文件:

c++ 数据结构 利用顺序栈实现多项式的中缀转后缀_第5张图片

二.源文件

1.中缀转后缀:

c++ 数据结构 利用顺序栈实现多项式的中缀转后缀_第6张图片

c++ 数据结构 利用顺序栈实现多项式的中缀转后缀_第7张图片

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


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

c++ 数据结构 利用顺序栈实现多项式的中缀转后缀_第8张图片


 


 

 

  

  



你可能感兴趣的:(数据结构(c++))