中缀表达式变后缀分析

中缀表达式变后缀表达式

@(算法学习)

将中缀变为相应的后缀,需要根据的优先级来进行栈的变化。
具体操作是:我们用一个栈即可,存储的是符号栈,数字直接输出,因为符号输出顺序以及时机需要调整,因此用栈做中转。
在扫描符号时,我们称符号的优先级是栈外优先级,这个时候在决定谁可以进栈。
等到扫到非数字符号,则可以有机会进栈,每个非数字符号有优先级定义。进到栈的元素呢,优先级要被重新分配。

进栈时要与栈顶元素比较,跨在门槛的瞬间,栈外元素用的是栈外的优先级,栈内元素是栈内元素的优先级。只有栈外的大,才能进来。否则,比栈顶小或者相等,都要让栈顶的出去,直到有比栈外的小的栈顶为止,然后才能进去。

总的优先级分配很简单,1~6.
栈外的左括号,一定要进得去,所以有最大优先级6,进去以后,将是最晚出来的,因此,进去以后马上变为最小的1。

右半括号在栈外,与栈顶比较时,它需要找到栈内的另一半左括号,因此它的优先级与栈内的左括号相等,为1,是最小的。进去后变为最大优先级,实际上右括号是进不去的。

加减乘除的优先级在栈外比栈内高1。
加减比乘除对应小1。
无论栈内栈外乘除一定比加减高。

这样的话,栈顶是加减时,乘除一定进来。
栈顶是乘除时,加减进来一定是把乘除先挤出去。

此外,加进来,栈顶是减时,栈顶也要出去,相等也是出栈的条件。
同样,乘除也是。
我们称作同类相残。

一般以icp(in coming priority)表示栈外优先级

isp(in stack priority)表示栈内优先

int icp (char ch) 的定义如下:
int icp(char ch)
{
     switch (ch)
    {
           case '#':
                 return 0;
          case '(':
                 return 6;
          case '+':
          case '-':
                 return 2;
          case '*':
          case '/':
          case '%':
               return 4;
         case ')':
            return 1;
     }
}
int isp (char ch) 的定义如下:
int isp(char ch)
{
     switch (ch)
    {
           case '#':
                 return 0;
          case '(':
                 return 1;
          case '+':
          case '-':
                 return 3;
          case '*':
          case '/':
          case '%':
               return 5;
         case ')':
            return 6;
     }
}

待补充例子。

举个例子:求中缀表达式a/b+(c*d-e*f)/g转换为后缀表达式过程中,当扫描到f时,栈中的元素依次是:+(

  • 扫描到a,输出
  • 扫描到/,进栈,栈序列:/
  • 扫描到b,输出
  • 扫描到+,+进不来,需要让’/’出去,栈序列:+
  • 扫描到(,进栈,栈序列为:+(
  • 扫描到c,输出
  • 扫描到,进栈,栈序列:+(
  • 扫描到-,需要弹出*,栈序列变为+(-
  • 扫描到e,输出
  • 扫描到*,进栈,栈序列:+(-*
  • 扫描到f,输出

你可能感兴趣的:(算法学习,中缀变后缀)