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 ...