amazzzzzing

导航

数据结构 - 表达式计算

数据结构 - 表达式计算

〇、目标

  • 实现对诸如

\[2+((1+2)\times3+4)\div5 \]

表达式的计算。
要素仅包括:数字,四则运算,括号,并且是一个完整且正确的表达式。

一、前导

1. 操作数和操作符(运算符)

记表达式中的数字为操作数,其它元素为操作符(运算符)。数字并不限定为一个字符,但操作符仅为一个字符。

2. 中缀表达式和后缀表达式

中缀表达式是指书写时所用的表达式,其特点是操作数在操作符两端。计算中缀表达式时必须要考虑操作符的优先级。括号的优先级最高。
后缀表达式是为计算机计算设计的表达式,其特点是操作符在操作数的后面,计算总按前后顺序进行,因此隐含了优先级。后缀表达式不需要括号。

二、算法

1.中缀表达式转后缀表达式

inputlist为输入的中缀表达式,outputlist为输出的后缀表达式
infix2sufix为转换函数

infix2sufix(inputlist, outputlist) {
  stackOp 作为操作符栈
  listSufix 作为后缀输出缓存
  遍历inputlist,遍历指针为it {
    若it为操作数:
      stackOp.push(it)
    若it为左括号:
      stackOp.push(it)
    若it为右括号:
      循环出栈,并将弹出的元素追加至listSufix,直到
      碰到左括号为止。弹出的左括号直接丢弃。
    若it为其它操作符:
      先检查stackOp是否为空:
        如果为空:
          stackOp.push(it)
        如果不为空:
          检查栈顶元素优先级:
            如果栈顶元素优先级低于it的优先级:
              stackOp.push(it)
            否则(栈顶元素优先级不低于it优先级):
              循环检查,将不满足条件的出栈并追加至listSufix,直到
              栈空或者优先级条件不满足。
              stackOp.push(it)
  }
  弹出stackOp中的剩余元素,并追加至listSufix。
  outputlist=listSufix
}

2. 计算后缀表达式

calc为计算后缀表达式的函数
listSufix为输入的后缀表达式
calc(listSufix) {
  stackops作为操作数栈
  遍历listSufix,遍历指针为it {
    如果it为操作数:
      stackops.push(it)
    如果it为操作符:
      stackops连续出栈两个元素,分别记为num_b,num_a,
      计算 num_a op(it) num_b,并将结果操作数压入stackops。
  }
  从stackops弹出一个元素,作为返回值返回。
}

3.操作符的优先级

示例如下:
用数字表示优先级,从小到大表示优先级从低到高:

运算符 优先级
( 1
    • | 2
      \(\times \div\) | 3
      ) | 9

posted on 2020-10-31 17:35  amazzzzzing  阅读(786)  评论(0)    收藏  举报