西北工業大學NOJ資料結構 008逆波蘭式

2021-08-20 06:55:47 字數 2120 閱讀 8372

本題為將乙個中綴表示式轉化為逆波蘭式,同樣為棧的應用,以下為原題(づ ̄3 ̄)づ╭❤~

有必要解釋以下逆波蘭式,其實就是字尾表示式,也就是計算機計算時識別的語言,比如上方的ab+c*,那麼計算機就依次讀取,a、b然後+,之後就可以計算a+b,然後c、*,也就是把a+b的和與c相乘,稍微詳細一點的逆波蘭式推薦知乎搜尋:逆波蘭式到底是什麼鬼(雖然提問者有點睿智,但是幾個回答者都是dalao

為了解決這個問題我建立了三個棧s1,s2,s3,其實從中綴到字尾的轉化只需要乙個棧(而從中綴到字首則需要兩棧),因為只需要將運算子放到棧s1中來回倒就ok(滑稽),額外建立的兩個棧.......沒什麼用,儲存表示式罷了,完全可以直接用字串解決.......睿智了我......

思路分析,依次讀取字串的字元,先將乙個「#」壓進s1,作為乙個比較的基礎(\(^o^)/)

1.如果是字元,則直接壓倒棧s2中,(知道為啥有s3了嗎,因為壓到s2中後輸出是反的!反的!迫不得已最後再倒進s3在輸出,哭唧唧)

2.如果是運算子,則就需要比較這個運算子和棧頂元素的優先級別了,假設之前棧頂的運算子為c1,後來讀取的運算子為c2。

則有:如果c2優先順序高於c1,那麼c2壓進s1棧儲存

如果c2優先順序低於c1,那麼s1將c1彈出並壓進s2,然後比較新的s1的棧頂元素和c2,如果還是c2優先級別低,那就再彈乙個c1,最後直到c1的優先級別低於c2,此時將c2壓進棧s1。(大概就這樣....其實意思就是要是c2想進棧,棧頂元素的優先順序必須比他小,別忘了最下邊還壓著乙個「#」,這玩意優先級別最低)

那麼他們的優先順序順序如下圖所示,(很重要!!但是不需要背啊啥的,看看就懂了,乘除優先於加減,括號優先,就醬=_=)

需要特別注意為『(』,因為左括號的優先順序其實是有改變的,如果c2是左括號,則優先級別最高,如果c1是左括號,則優先級別最低,稍微理解一下,因為如果下乙個來的是左括號的話,那麼你必須先運算括號裡邊的,所以優先級別超級高,但是如果左括號已經壓進棧內了,那麼你必須等到有乙個右括號來跟他(交配),才能完成括號內的計算。

好了思路就這樣,上**

#include#include#includetypedef struct nodenode;

typedef struct linkstackstack;

stack *creat(void)

int is_empty(stack *plstack)//檢查棧是否為空

void push(stack *plstack,char x)//動態申請並將一元素入棧

}char pop(stack *plstack)

return elem;

}char toplink(stack *plstack)//如果棧非空則返回棧頂元素

stack *nibolan(char *e)

case')':

cp=pop(s1); //將左括號出棧,不要了,因為字尾表示式不需要括號

break;

}case'+':

case'-':

else

}push(s1,*p); //到最後再吧這個加減號壓進s1

length++;

break;

}case'*':

case'/':

else

}push(s1,*p); //直到碰到優先順序高直接壓進

length++;

break;

}default:

push(s2,*p); //其他數字直接壓進2棧

length++;

} }while(!is_empty(s1)&&toplink(s1)!='#')

while(!is_empty(s2))

return (s3);

}void show(stack *p)

}int main()

西北工業大學複試上機題2019 3

題目描述 判斷ip位址是否合法,n行,以字串形式輸入,格式為a.b.c.d,每個均為整數,輸出判斷是否為有效ip,每個數均在 0,255 之間。是輸出yes否no 輸入樣例 2 1.2.3.4 172.168.0.300 輸出 yes no include include include using...

2023年西北工業大學 D 玩具

題目在這裡 題目 這道題讀來感覺很難,也確實有一種相對應的的正解 我覺得是權值線段樹,可惜我不會 在仔細讀題發現這道題的真正意思其實就是把整個陣列當做乙個區間,裡面的區間就是他的子區間,在一定程度上可以認為母區間的出現次數最多的數,在一些子區間裡也是出現次數最多的數 也就是我們常數的一列數字的眾數 ...

NWPU CTF 西北工業大學留言板

這題考察的是session檔案包含來獲取flag。因為可以用偽協議讀取相關的所有檔案,所以建議在本地復現一下,可以更好的理解。header session start function safe msg else if isset session msg empty session msg sess...