---恢復內容開始----
養成良好的習慣,看了下別人寫的部落格,條理清晰,美觀,整潔。借鑑下。
問題描述
設表示式有單字母變數和雙目四則運算構成,試寫一演算法,將書寫正確的表示式轉換為逆波蘭表示式。
問題分析
要準確地理解逆波蘭式,比如表示式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...