棧的運用(5)轉換逆波蘭式

2022-01-17 08:10:31 字數 1746 閱讀 2421

---恢復內容開始----

養成良好的習慣,看了下別人寫的部落格,條理清晰,美觀,整潔。借鑑下。

問題描述  

設表示式有單字母變數和雙目四則運算構成,試寫一演算法,將書寫正確的表示式轉換為逆波蘭表示式。

問題分析 

要準確地理解逆波蘭式,比如表示式a+b*c-a+b/e的逆波蘭式是abc*+a-be/+,根據這一點可以理清演算法的思路。輸入乙個表示式,儲存到乙個陣列中,第乙個肯定是運算元,依然在陣列中,陣列下標為0,然後再遍歷下乙個,當它為運算子是壓入棧中,下乙個運算元放在陣列下標為1的位置,再判斷下乙個,為運算子,則與棧中已有的運算子進行比較,如果此運算子級別較大,則將此運算子壓入棧,反之,將棧中的運算子先彈出來,讓此運算子先入棧,然後再將彈出來的運算子入棧,

---恢復內容結束---

代 碼   

view code

1 #include2 #include3

#define stack_init_size 100

4#define stackincrement 10

5 typedef char

elemtype;

6 typedef struct

stack;

1112

int initstack(stack &s)

1321

22int gettop(stack &s,elemtype &e)//

elemtype &e又代表什麼意思呢?代表指標,取位址

2329

30int push(stack &s,elemtype e)

3138 *s.top++=e;//

先賦值給s.top然後再將指標加一

39return1;

40}4142

int pop(stack &s,elemtype &e)

47bool emptystack(stack &s);

48bool isoperator(char

c);49

bool compare(char c1,char

c2);

50int

main()

5166

else

74else

//若下乙個運算子的級別低於棧中的元素時,將運算子出棧

7582}83

}84else88}

89}90while(!emptystack(s))

9196 printf("%s"

,a);

9798

return1;

99100

}101

bool emptystack(stack &s)

107bool isoperator(char

c)119

}120

bool compare(char c1,char

c2)

總結     

說實話,可能這才算真正意義上的程式設計了,昨晚這**還沒除錯成功,朋友就來叫我回去,看到自己思路屬於混亂狀態,也就沒有繼續做下去,回去的時候在想,有些基本的知識我並不懂,思路也不是很清晰,想問題會卡在某個地方。這是最重要的問題,學會思考,條理清晰,善於分析。我不得不說,自己以前的學習都是在「偽學習」,沒有這些思考,也就嘗不到學習的樂趣,相應地也就會把學習作為一種負擔,我希望這是乙個開始,現在意識到這些問題還不遲,我的學習態度,學習方法應該要有個大的轉變。

我得承認寫這個**,讓我對棧的基本操作有了更深的認識,並學會運用,剛開始只是知道這麼個概念,學以致用,繼續加油!

棧的運用 6 逆波蘭式求值

問題描述 對以逆波蘭式的表示式求值。問題分析 上一題是把中綴表示式程式設計逆波蘭式,要對逆波蘭的表示式的求解就更簡單些了。view code 1 include2 include3 define stack init size 100 4 define stackincrement 10 5 typ...

逆波蘭式的轉換與計算 簡單

我們平常書寫的表示式 如2 3 4 4 又稱為中綴表示式,我們可以將它轉換為字尾表示式 213 4 輸入有兩行,第一行為逆波蘭式的結果,第二行為輸入表示式的正確計算結果。逆波蘭式中相鄰的數字或運算子之間不用輸出空格 保證表示式計算的合理性,不需判斷除零等情況 表示式的計算遵循同級運算從左向右,先乘除...

棧應用 逆波蘭式表示式的值

問題描述 計算給定的逆波蘭表示式 即字尾表示式 的值。事實上,二元運算的前提下,中綴表示式可以對應一棵二叉樹 逆波蘭式即該二叉樹後序遍歷的結果。分析思路 code 給出乙個逆波蘭式,計算該表示式的值 param s return public intgetthevalueofrpn string s...