資料結構 逆波蘭式

2022-01-11 02:08:21 字數 2109 閱讀 8117

很久沒有關注演算法和資料結構,大部分知識都已經忘記了;是時間好好回爐一下了,說實話幹讀資料機構這本書還是挺枯燥而且這本書原理性比較多,有一定的難度。這不剛看到逆波蘭式廢了好大勁才搞懂,老了。。。

逆波蘭式(reverse polish notation,rpn,或逆波蘭記法),也叫字尾表示式(將運算子寫在運算元之後)

乙個表示式e的字尾形式可以如下定義:

(1)如果e是乙個變數或常量,則e的字尾式是e本身。

(2)如果e是e1 op e2形式的表示式,這裡op是如何二元操作符,則e的字尾式為e1'e2' op,這裡e1'和e2'分別為e1和e2的字尾式。

(3)如果e是(e1)形式的表示式,則e1的字尾式就是e的字尾式。

如:我們平時寫a+b,這是中綴表示式,寫成字尾表示式就是:ab+

(a+b)*c-(a+b)/e的字尾表示式為:

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

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

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

→(ab+c*)(ab+e/)-

→ab+c*ab+e/-

將乙個普通的中序表示式轉換為逆波蘭表示式的一般演算法是:

首先需要分配2個棧,乙個作為臨時儲存運算子的棧s1(含乙個結束符號),乙個作為輸入逆波蘭式的棧s2(空棧),s1棧可先放入優先順序最低的運算子#,注意,中綴式應以此最低優先順序的運算子結束。可指定其他字元,不一定非#不可。從中綴式的左端開始取字元,逐序進行如下步驟:

(1)若取出的字元是運算元,則分析出完整的運算數,該運算元直接送入s2棧

(2)若取出的字元是運算子,則將該運算子與s1棧棧頂元素比較,如果該運算子優先順序(不包括括號運算子)大於s1棧棧頂運算子優先順序,則將該運算子進s1棧,否則,將s1棧的棧頂運算子彈出,送入s2棧中,直至s1棧棧頂運算子低於(不包括等於)該運算子優先順序,最後將該運算子送入s1棧。

(3)若取出的字元是「(」,則直接送入s1棧頂。

(4)若取出的字元是「)」,則將距離s1棧棧頂最近的「(」之間的運算子,逐個出棧,依次送入s2棧,此時拋棄「(」。

(5)重複上面的1~4步,直至處理完所有的輸入字元

(6)若取出的字元是「#」,則將s1棧內所有運算子(不包括「#」),逐個出棧,依次送入s2棧。

完成以上步驟,s2棧便為逆波蘭式輸出結果。不過s2應做一下逆序處理。便可以按照逆波蘭式的計算方法計算了!

//

'1 + 2 * 3 + (4 * 5 + 6) * 7'

function

reversepolish() ;

this.rp =;

}reversepolish.prototype.convert = function

(str)

else

else

else

if (e === ')')

} else

if(op)

this

.operatorstack.push(e);}}

}});

//執行結束後將所有的操作符棧彈出

let op = this

.operatorstack.pop();

while

(op)

console.log(

this.rp.join(' '));

};//

15 2 3 * + 4 5 * 6 + 7 * +

reversepolish.prototype.eval = function

() else

if (this

.operator[e])

}});

return

numberstack.pop();

}let rp = new

reversepolish();

rp.convert('15 + 2 * 3 + (4 * 5 + 6) * 7');

rp.eval();

感覺逆波蘭式不僅是一種方法,更是一種思想,逆波蘭式這種計算方法沒有必要知道任何運算子優先規則。就像我們實際業務中有很多邏輯判斷、各種優先順序的場景,是否也可以使用逆波蘭式的思想來解決?上面的例子也是比較簡單的情況,沒有考慮運算子的執行順序,對於2^2^3這個種,實際是等於2^8等於256,而不是4^3=64.

資料結構08 逆波蘭式

time limit 3000ms,memory limit 10000kb accepted 277,total submissions 763 description 假設表示式由單字母變數和雙目四則運算算符構成。試編寫程式,將乙個通常書寫形式且書寫正確的表示式轉換為逆波蘭式。input 輸入由...

資料結構習題 8逆波蘭式

time limit 3000ms memory limit 10000kb description 假設表示式由單字母變數和雙目四則運算算符構成。試編寫程式,將乙個通常書寫形式且書寫正確的表示式轉換為逆波蘭式。input 輸入由單字母變數和雙目四則運算算符構成的表示式。output 輸出其逆波蘭式...

波蘭式和逆波蘭式

字首 中綴 字尾表示式是對表示式的不同記法,其區別在於運算子相對於運算元的位置不同,字首表示式的運算子位於運算元之前.中綴和字尾同理 雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。對計...