洛谷P8815題解
對給出的表達(dá)式建立表達(dá)式樹,再遍歷計算兩種短路次數(shù):先計算左子樹,如果短路就忽略右子樹。
怎么建樹:
用兩個棧,一個存表達(dá)式樹的操作數(shù)(結(jié)點編號、也可以同時把值算出來),一個存運算符。
一個括號就是一棵子樹,最后括號內(nèi)的所有東西都會變成一個值,即遇到完整括號就要立刻處理。
而括號內(nèi)的表達(dá)式是按優(yōu)先級算的(同優(yōu)先級從左到右),計算的時候,讓運算符棧保持優(yōu)先級的嚴(yán)格單調(diào)性:
比如 1 & 1 | 0 處理到 | 的時候讓 1 & 1 先算出結(jié)果
反過來 1 | 1 & 0 處理到 & 的時候就不必先計算 1 | 1
而 1 | 1 | 0 處理到第二個 | 時,也要先處理 1 | 1
所謂處理,就是從操作數(shù)棧中取出兩個元素,運算符棧中取出一個符號,來連邊建樹
現(xiàn)在從左到右掃一遍表達(dá)式,一共有六種字符:( 、) 、 0、 1、 &、 |
遇到左括號,就直接入棧 遇到右括號,就一直出棧,處理到對應(yīng)的左括號為止 遇到數(shù)字,就建立葉子結(jié)點 遇到運算符,就先循環(huán)查看棧頂是否優(yōu)先級高于或等于當(dāng)前運算符,是就進(jìn)行處理,最后把運算符入棧 最后處理運算符棧中剩余的運算,時間復(fù)雜度 O(|S|)。
看我這么努力,確定不點個贊再走嘛
標(biāo)簽: