簡體   English   中英

確定數學運算符的優先級

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM