資料結構與演算法筆記 10 表示式

2021-10-02 01:25:19 字數 3106 閱讀 9121

概述

本文所討論的表示式指的是數學表示式。在數學表示式中,最常見的結構是由一組二元運算子和運算物件構成,通常,二元運算子寫在運算物件中間,這樣的形式成為中綴表示式。將運算子寫在運算物件前面稱為字首表示式,將運算子寫在運算物件的後面稱為字尾表示式。

本文對表示式的討論是假設運算子為二元運算子。

中綴表示式

中綴表示式是日常最習慣的一種表示式,但是作為表示式的表示方式,它很難統一的貫徹,對於一元和多元運算子難以用中綴表示式表示。

在運算子的元數唯一且確定的前提下,描述表示式的最重要的問題是準確描述表示式的順序,而中綴表示式不足以表示所有的可能的運算順序,它需要借助其他的輔助措施,比如輔助符號、約定的優先順序等。

字首表示式

字首表示式,也成為波蘭表示式,是由波蘭數學家 j. lukasiewicz 於2023年提出的,它將所有的運算子都寫在他們的運算物件前面。每個運算子的運算物件,就是它後面出現的幾個完整表示式,表示式個數由運算子的元數確定。這樣的規定完全不需要引入括號,它已自然地描述了計算順序。

字尾表示式

字尾表示式,也被稱為逆波蘭表示式,它與字首表示式類似,只不過運算子和運算物件的位置相反。其中所有運算子都寫在它們的運算物件之後。每個運算子的運算物件,就是它前面出現的幾個完整表示式,個數也是由元素安撫的元數確定的,同樣它也自然的描述了複雜表示式的計算順序而不需要引入其他輔助機制。

字尾表示式特別適合計算機處理。

舉個栗子

一下三種表達形式描述的是同乙個計算過程

中綴形式: (3 - 5) * (1 + 2 * 4) / 6

字首形式: / * - 3 5 + * 2 4 1 6

字尾形式: 3 5 - 1 2 4 * + * 6 /

表示式的計算

假定我們要處理的是簡單的算術表示式,運算物件都是浮點數表示的數,只有四個運算子 『+』,』-』,』*』,』/』

字尾表示式的計算

字尾表示式的計算過程比較簡單,步驟如下:

演算法的基本結構就是上面這樣,我們使用棧儲存運算物件,使用python語言描述為:

# 定義乙個棧,用來儲存運算物件

class stack(object):

def __init__(self):

self._container =

def push(self, value):

def pop(self):

return self._container.pop()

def top(self):

return self._container[-1]

def is_empty(self):

return not self._container

def depth(self):

return len(self._container)

# 需要額外規定使用者的輸入用空格來區分運算子和運算物件

# 否則,需要額外處理

def suffix_exp_evaluator(line):

operators = '+-*/'

st = stack()

for x in exp:

if x not in operators:

st.push(float(x))

continue

if st.depth() < 2:

raise syntaxerror

a = st.pop()

b = st.pop()

if x == '+':

res = a + b

elif x == '-':

res = a - b

elif x == '*':

res = a * b

elif x == '/':

res = a / b

st.push(res)

if st.depth() == 1:

return st.pop()

raise syntaxerror

# 程式入口

def main():

while true:

try:

line = input('suffix expression: ')

if line == 'end': return

res = suffix_exp_evaluator(line.split(''))

print(res)

except exception as e:

print('error: ', type(e), e.args)

中綴表示式轉換

中綴表示式是一種處理起來比較複雜的表示式,因為上面已經定義了字尾表示式,現在將中綴表示式轉換成字尾表示式後就可以利用字尾表示式求值了。

轉換步驟:

轉換**實現:

# 定義運算子優先順序

priority =

infix_operators = '+-*/()'

# 中綴表示式轉換成字尾表示式

def trans_infix_suffix(line):

st = stack()

exp =

for x in line:

if x not in infix_operators: # 運算物件直接送出

if st.is_empty() and x == '(': # 左括號進棧

st.push(x)

elif x == ')':

while not st.is_empty() and st.top != '(':

if st.is_empty(): # 未找到左括號,表示式有問題

raise syntaxerror

st.pop() # 彈出左括號,不進棧

else:

# 比當前運算子優先順序大的運算子送出

while not st.is_empty() and priority[st.top()] >= priority[x]:

st.push(x)

while not st.is_empty():

if st.top() == '(':

raise syntaxerror

return exp

資料結構表示式

35,15,80,70,20,字尾表達方式 35 15 80 70 20 25 中綴表達方式 35,15,80,70,20 字首表達方式 人的思維方式很容易固定 正如習慣拉10進製。就對2,3,4,8,16 等進製不知所措一樣 人們習慣的運算方式是中綴表示式。而碰到字首,字尾方式。迷茫 其實僅僅是一...

PTA 資料結構與演算法 7 20 表示式轉換

如有不對,不吝賜教 進入正題 算術表示式有字首表示法 中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。輸入格式 輸入在一行中給出不含空格的中綴表示式,可包含 以及左右括號 表示式不超過20個字元。輸出格式 在...

資料結構 表示式計算

表示式求值時資料結構的基礎演算法之一,其主要思想就是堆疊的使用。下面將詳細的介紹演算法的各個部分 表示式求值演算法主要流程如下 首先要說明的是字尾表示式,字尾表示式即 不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行 不再考慮運算子的優先規則,如 2 1 3 ...