如何在程式中將中綴表示式轉換為字尾表示式?

時間 2021-05-08 10:36:02

1樓:何霖

This is a pseudo code:

InfixToPostfix(exp)

This is the related link:

mycodeschool

2樓:consoles

// 字尾表示式的優點

// 最左邊一定是數字

// 不用括號,依靠運算子順序確定運算子的優先順序

// 更符合計算機的計算方式:從左到右讀取字尾表示式,就可以將遇到的運算物件壓入棧中,在遇到運算子的時候就彈出2個運算物件,完成計算後將結果壓入棧中。最後留在棧中的就是計算結果

function solve(str) else if (token === '('continue;

} else if (token === ')'let num2 = valueStack.poplet num1 = valueStack.poplet op = opStack.

popvalueStack.push(`$$$;

const isOpNum = token => priorityMap[token] === void 0;

const opStack = ;

const resultStackconst tokens = str.split(/\s*/).map(x => x.

trim()).filter(x => x.length > 0);

// 運算元入值棧

// 左括號入符號棧

// 遇到右括號則從符號棧中不斷出棧,直至左括號出棧,並把出棧的內容放入值棧

// 如果當前操作符的優先順序大於棧頂優先順序,入符號棧

// 當前操作符優先順序小於等於棧頂優先順序,則一直出棧,並把出棧內容壓入值棧

// 右括號不入棧,碰到右括號需要從符號棧中向前掃瞄找到左括號,並以此將掃瞄的內容加入值棧

for (let token of tokens) else

最近也遇到了這個問題

3樓:哲一發兒

這幾天剛剛學習,自己試著用語言描述一下演算法過程加深一下印象。

給乙個python版本的。

使用棧來儲存運算子使用列表來儲存處理完成之後的數字表示式。

先給運算子定義乙個優先順序。

priority =

然後從左到右遍歷給出的中綴表示式中的每乙個數字或者符號:

如果掃瞄到乙個運算子則不能將其立刻輸出,將此運算子與棧頂的運算子不斷進行優先順序比較,若優先順序小於等於棧頂符號,則將棧頂符號出棧並寫入列表,此時會有新的棧頂符號,繼續進行比較,直到優先順序大於棧頂符號時,將此符號壓入棧頂。

如果掃瞄到左括號(「(」),則將其壓入棧頂。如果掃瞄到右括號,則將兩個括號之間除了括號的符號逐個輸出到列表,最後將左括號出棧(不輸出)。

最後,在遍歷完整個中綴表示式的時候,棧裡可能還會剩下一些運算子,把他們一一彈出送到列表中。

舉例,題主給的 (31.8+3.2)/5。

遍歷,首先將「("入棧,然後將31.8寫入列表,」+"入棧,3.2寫入列表,掃瞄到「)",將兩括號之間所有運算子依次寫到列表中,然後將5寫入列表,最後將/寫入列表。

答案是:31.8 3.2 + 5 /

4樓:海納

已經有很多人給了思路了。我這裡再補充乙個:遞迴下降翻譯成語法樹,然後後序遍歷就得到字尾式,前序遍歷就得到字首式:

知乎專欄

5樓:

用stack Infix, Prefix and Postfix Expressions 看完啥都懂了,起碼再有問題也知道怎麼搜尋查詢了

6樓:趙扶風

這個問題對應的是排程場演算法。

讀懂下面這段話,也就學會如何轉換了:

規則:從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即成為字尾表示式的一部分;若是符號,則判斷其與棧頂符號的優先順序,是右括號或優先順序低於棧頂符號(乘除優先加減)則棧頂元素依次出找並輸出,並將當前符號進棧,一直到最終輸出字尾表示式為止。

from 將中綴表示式轉化為字尾表示式 -- 簡明現代魔法

-針對問題中示例的具體實現:

一。用字母代替數字,用小括號代替中/大括號 (為後續處理方便)

20*[(2.44-1.8)/0.4+0.15]

a=20, b=2.44, c=1.8, d=0.4, e=0.15,

a*((b-c)/d+e)

二。實現排程場演算法

1. 在結尾加一結束符:a*((b-c)/d+e)#

2. 處理過程:

輸入輸出更新後的棧內容(自底到頂)

a a

* aaab ablvl(-)=1, lvl(()=0

- abc abcabclvl(/)=2, lvl(()=0

/ abcd abc-dlvl(+)=1, lvl(/)=2

+ abc-de abc-d/eabc-d/eabc-d/e+*

3. 將字母還原為數字:20 2.44 1.8 - 0.4 / 0.15 + *

-幾個測試用例:

(31.8+3.2)/5 => 31.8 3.2 + 5 / => 7

20*[(2.44-1.8)/0.4+0.15] => 20 2.44 1.8 - 0.4 / 0.15 + * => 35

9+(3-1)*3+10/2 => 9 3 1 - 3 * + 10 2 / + => 20

5+((1+2)*4)-3 => 5 1 2 + 4 * + 3 - => 14

另外,字尾表示式是可以直接求值的,感興趣可以繼續實現下。

中綴表示式「5 + ((1 + 2) * 4) 3」寫作

5 1 2 + 4 * + 3

下表給出了該逆波蘭表示式從左至右求值的過程,堆疊欄給出了中間值,用於跟蹤演算法。

輸入操作堆疊注釋

5 入棧 5

1 入棧 5, 1

2 入棧 5, 1, 2

+ 加法運算 5, 3 (1, 2)出棧;將結果(3)入棧

4 入棧 5, 3, 4

* 乘法運算 5, 12 (3, 4)出棧;將結果(12)入棧

+ 加法運算 17 (5, 12)出棧;將結果 (17)入棧

3 入棧 17, 3

減法運算 14 (17, 3)出棧;將結果(14)入棧計算完成時,棧內只有乙個運算元,這就是表示式的結果:14

上述運算可以重寫為如下運算鏈方法(用於HP的逆波蘭計算器):[3]

1 2 + 4 * 5 + 3

from 逆波蘭表示法

Shunting-yard algorithm

如何用正規表示式表達2020 10 1的日期,求各位大佬指點,挺急的 ?

1 9 0 9 1 9 1 0,1,2 1 9 1 0 9 2 0 9 3 0,1 上述回答基於以下幾個限制 1.年月日開頭的0不寫 2.填寫人自己不要瞎寫日期,比如2000.2.31和2001.2.29,顯然不是正確日期,但我給的正則會識別為真 劉長元 從你的問題描述來看,我感覺你對正規表示式的理...

正規表示式攻擊 ReDoS 如何預防?

小小的寂寞 支援自定義萬用字元的站內搜尋功能有可能受到類似攻擊。當然我是說理論上。可以把有可能出現 ReDoS 的部分用單獨 worker 執行緒做 如果用 Node 的話,其他回答中說是多程序 並且配置伺服器集群以降低這個問題可能帶來的危害。 舒辰 不是太理解為什麼會存在這個問題,記得正規表示式和...

正規表示式如何匹配 3 的倍數?

Ethan 先轉為二進位制 1 10 1 01 0 10 然後用這條正則匹配就對了 思路是 finite automata 和二進位制正則判斷數字是否能被5整除 趣味Python每週一題20170912 0369 147 258 0369 258 147 0369 258 0369 258 258 ...