1. 程式人生 > >棧和佇列的應用之"表示式求值"和"魔王語言"

棧和佇列的應用之"表示式求值"和"魔王語言"

一:魔王語言

[問題描述] 有一個魔王總是使用自己的一種非常精練而又抽象的語言講話,沒有人能聽得懂,但他的語言是可以逐步解釋成人能聽懂的語言,因為他的語言是由以下兩種形式的規則由人的語言逐步抽象上去的:
(1) α -> β1β2…βm
(2)(θδ1δ2…δn)->θ δn θδn-1…θδ1 θ
在這兩種形式中,從左到右均表示解釋。試寫一個魔王語言的解釋系統,把他的話解釋成人能聽得懂的話。
[基本要求] 用下述兩條具體規則和上述規則形式(2)實現。設大寫字母表示魔王語言的詞彙;小寫字母表示人的語言詞彙;希臘字母表示可以用大寫字母或小寫字母代換的變數。魔王語言可含人的詞彙。
(1)B -> tAdA
(2)A -> sae

這個問題描述第一次接觸的人有點難理解啊,舉個例子,B(ehnxgz)B怎麼解釋呢?
1:對於”B”,就是tAdA = tsaedsae
2:對於括號中的是人的語言:首先取出第一個字母e,然後讓它和最後一個z結合,同理,一直到e本身,但是它本身只輸出一次,也就是”ezegexenehe”這個序列

解決方法就是用棧和佇列,這不說了和沒說一樣嗎,那就點這裡,程式碼中有註釋,歡迎交流評論。

二:表示式求值

主要是利用棧的”先進後出”的思想方便我們可以把目前可以運算的數字得到參與運算,首先初始化兩個棧,一個作為運算子棧,一個作為數字棧,我們規定輸入的表示式必須以“#”結尾,實際上也可以不以”#”,運算子棧底初始化的時候初始化為’\n’就行了,但是不太好看,下面再說說我們每次讀到一個符號之後應該幹什麼。
1:讀到的是數字,直接入數字棧。
2:讀到的是運算子,則與當前棧頂元素比較,如果大於當前棧頂元素,將其入操作符棧;如果小於,從操作符棧頂取出一個操作符,從數字棧頂取出兩個運算元,然後計算,之後不用讀取,我的程式只有左右括號相遇時才會等於,那麼就將括號出棧忽略,然後運算就行了,當兩個運算子優先順序再我們看來一樣的時候,實際上做的處理是小於的情況,因為實際上如果運算子優先順序一樣,我們就應該運算。詳細程式碼

點這裡