逆波蘭c語言
『壹』 將下面的算術運算式表示成逆波蘭式(數據結構 c語言版)
a*b*c → **abc
a*b*c+c*d → +**abc*cd
(a+b)*((c-d)*e+f) → *+ab+*-cdef
上面是波蘭式,逆波蘭式如下:
a*b*c → ab*c*
a*b*c+c*d → ab*c*cd*+
(a+b)*((c-d)*e+f) → ab+cd-e*f+*
寫出(a+b)*((c-d)*e+f)轉換時棧的變化情況:【注意,右端為棧頂】
讀入(,入棧,棧中為(,輸出:(空);
讀入a,直接輸出,棧中為(,輸出:a;
讀入+,入棧,棧中為(+,輸出:a;
讀入b,直接輸出,棧中為(+,輸出:ab;
讀入),依次推出棧中的符號,直到遇見一個(【注意括弧不輸出】,棧中為空,輸出:ab+;
讀入*,入棧,棧中為*,輸出:ab+;
讀入(,入棧,棧中為*(,輸出:ab+;
讀入(,入棧,棧中為*((,輸出:ab+;
讀入c,直接輸出,棧中為*((,輸出:ab+c;
讀入-,入棧,棧中為*((-,輸出:ab+c;
讀入d,直接輸出,棧中為*((-,輸出:ab+cd;
讀入),依次推出棧中的符號,直到遇見一個(【注意括弧不輸出】,棧中為*(,輸出:ab+cd-;
讀入*,入棧,棧中為*(*,輸出:ab+cd-;
讀入e,直接輸出,棧中為*(*,輸出:ab+cd-e;
讀入+,【由於此時棧中的*的優先順序高於+,所以先將*退棧,然後+入棧】,棧中為*(+,輸出:ab+cd-e*;
讀入f,直接輸出,棧中為*(+,輸出:ab+cd-e*f;
讀入),依次推出棧中的符號,直到遇見一個(【注意括弧不輸出】,棧中為*,輸出:ab+cd-e*f+;
此時讀入已經完畢,棧中還剩一個*,輸出:ab+cd-e*f+*
完畢!
以上就是整個從中綴表達式到後綴表達式的過程,棧的變化情況已經都寫出來了。
『貳』 c語言中的後綴表達式是什麼意思
轉化後的後綴表達式為:abcde/+*+
具體分析:
1、初始化一空棧,用來對符號進出棧使用。
8、棧頂元素「(」出棧,「/」出棧,「+」出棧,「(」出棧,括弧配對完成。
9、之後也是依次出棧,最後結果為:abcde/+*+。
(2)逆波蘭c語言擴展閱讀:
後綴表達式進行計算的通用做法:
可以先建立一個棧S 。從左到右讀表達式,如果讀到操作數就將它壓入棧S中,如果讀到n元運算符(即需要參數個數為n的運算符)則取出由棧頂向下的n項按操作符運算,再將運算的結果代替原棧頂的n項,壓入棧S中 。如果後綴表達式未讀完,則重復上面過程,最後輸出棧頂的數值則為結束。
後綴表達式:也叫逆波蘭表示法(Reverse Polish notation,RPN,或逆波蘭記法),是一種是由波蘭數學家揚·武卡謝維奇1920年引入的數學表達式方式,在逆波蘭記法中,所有操作符置於操作數的後面,因此也被稱為後綴表示法。逆波蘭記法不需要括弧來標識操作符的優先順序。
實際意義:
1、當有操作符時就計算,因此,表達式並不是從右至左整體計算而是每次由中心向外計算一部分,這樣在復雜運算中就很少導致操作符錯誤。
2、堆棧自動記錄中間結果,這就是為什麼逆波蘭計算器能容易對任意復雜的表達式求值。與普通科學計算器不同,它對表達式的復雜性沒有限制。
3、逆波蘭表達式中不需要括弧,用戶只需按照表達式順序求值,讓堆棧自動記錄中間結果;同樣的,也不需要指定操作符的優先順序。
4、逆波蘭計算器中,沒有「等號」鍵用於開始計算。
5、逆波蘭計算器需要「確認」鍵用於區分兩個相鄰的操作數。
6、機器狀態永遠是一個堆棧狀態,堆棧里是需要運算的操作數,棧內不會有操作符。
7、教育意義上,逆波蘭計算器的使用者必須懂得要計算的表達式的含義。
『叄』 c語言程序設計,設計一個簡單的程序,能完成加減乘除運算,網上搜的答案運行都出現很多錯誤,解釋一下程
1、簡單版本的,輸入兩個數一個操作符:「1 + 2」類似這種,直接獲取兩個數以及操作符,用switch語句來分別對不同操作符進行操作。
2、復雜版本的,隨意輸入表達式,可以有括弧以及其他運算符,「1+2*8+(6/7)^3」類似這種,有四種解決辦法:
2.1、一遍一遍地掃描字元串,優先順序越高的運算符越先做,每掃描一次減少一點,直到表達式只剩一個數值。
2.2、將表達式通過棧轉換為逆波蘭表達式,並計算逆波蘭表達式。
2.3、遞歸求解,使用類似BNF的定義來使用遞歸將表達式一點一點剝離成小表達式,計算完小表達式後,將多個小表達式綜合起來,即為整個表達式的值。
2.4、直接使用lex和yacc來寫一個計算器,需要寫的代碼量很少,自動生成的代碼量比較多。
主要就這幾種思路,細節問題你可以自己上網查。