[英]Determine precedence of mathematic operators
我必須將非完全括號內的序列從中綴轉換為后綴。 這也需要使用堆棧。 有一個堆棧供操作員存儲。 我需要確定運算符的優先級,以確保將正確的運算符打印在轉換后的后綴序列中的正確位置。 這是偽代碼:
如果(下一個輸入是左括號),請執行以下操作:讀取左括號並將其壓入堆棧。 否則,如果(下一個輸入是數字或其他操作數),則讀取操作數並將其寫入輸出。 否則,如果(下一個輸入是操作符號之一){從堆棧上彈出並打印操作,直到發生以下三種情況之一:(1)堆棧變空,(2)堆棧上的下一個符號是左括號,或(3)堆棧上的下一個符號是比下一個輸入符號優先級低的操作。 這些情況之一發生時,停止彈出,讀取下一個輸入符號,然后將此符號壓入堆棧。 } else {讀取並丟棄下一個輸入符號(應為右括號)。 從堆棧彈出和打印操作,直到堆棧上的下一個符號是左括號為止。 (如果未遇到左括號,則打印一條錯誤消息,指出括號不平衡並暫停。)最后,彈出並丟棄左括號。 } while(還有更多要讀取的表達式);
粗體字使我感到困惑。 有人對這個方法有建議嗎? 讓我知道是否需要更多信息。
似乎所描述的過程對我來說也有點模糊,但我認為這是說你有
...(2 + 3 ^ 4 * 5 - 6)...
並且您的堆棧開始看起來像(
所以你找到2
並用它做事,然后找到+
。 堆棧上的下一個符號是(
因此,您閱讀+
並將其推入堆棧。現在您的堆棧看起來像(+
。
然后您找到3
,用它做您的事,然后繼續查找^
。 該描述使您聽起來似乎可以從這里開始彈出,因為如果遇到else if
它會遇到第二個else if
但是由於您的膽量而不會。 堆棧上的下一個符號是+
且優先級較低。 您不知道^
后的符號是什么,因此您還無法開始彈出。 相反,您將^
壓入堆棧並繼續進行解析。 您的堆棧看起來像(+^
。
您找到4
並用它來做您的事情。 然后,您向前解析並找到*
。 堆棧上的下一個符號具有更高的優先級,因此您開始彈出直到堆棧上的下一個符號為+
。 由於優先級低於*
(“下一個輸入”),因此將*
壓入堆棧並再次向前解析。 您的堆棧看起來像(+*
。
您找到5
並用它做自己的事。 我想如果您制作一個真正的計算器,通常您會得到一個#2的堆棧,里面有數字。 現在,下一個輸入符號-
因此你彈出堆棧上的所有回來的路上,直到下一個符號(
你又再次停止雨后春筍般冒出,因為你還有。 -
作為下一個輸入等待周圍無論是在右側(您假裝您剛剛彈出的內存中有407個存儲在內存中。)
您向前解析,到達6
然后用它做您的事情。 下一個符號是)
,它不符合任何內部條件,因此您將其丟棄。 如果此處有一堆長運算符,那么您將再次彈出,而只打印-
。 現在,堆棧上的下一個符號是(
再次。您彈出並丟棄它。
我猜這就是應該的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.