藍橋杯試題集 演算法篇 表示式計算

2021-09-01 10:08:44 字數 2085 閱讀 5150

問題描述

輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。

輸入格式

輸入一行,包含乙個表示式。

輸出格式

輸出這個表示式的值。

樣例輸入

1-2+3*(4-5)

樣例輸出

-4資料規模和約定

表示式長度不超過100,表示式運算合法且運算過程都在int內進行。

分析:這個題我知道用表示式的中綴表示式和字尾表示式的結合(逆波蘭式),內部用棧來實現算術棧和運算子棧,但是我不太會寫**,看了一篇csdn上的題解,感覺寫的很清楚,就借鑑了過來。

1.將中綴表示式轉換為字尾表示式的方法:

(1) 初始化兩個棧:運算子棧s1和儲存中間結果的棧s2;

(2) 從左至右掃瞄中綴表示式;

(3) 遇到運算元時,將其壓入s2,這裡由於運算數可能大於10,所以如果數字後面乙個符號是運算子,則將『#』入s2棧充當分割線;

(4) 遇到運算子時有三種情況:

(4-1) 三種情況下直接入s1棧①s1為空②運算子為『(』③運算子優先順序比s1棧頂運算子的高;

(4-2)如果右括號「)」,則依次彈出s1棧頂的運算子,並壓入s2,直到遇到左括號為止,此時將這一對括號丟棄;

(4-3) 若運算子優先順序小於或等於s1棧頂運算子的優先順序,則依次彈出s1棧頂元素,直到運算子的優先順序大於s1棧頂運算子優先順序;

(6) 重複步驟(2)至(5),直到表示式的最右邊;

(7) 將s1中剩餘的運算子依次彈出並壓入s2;

(8) 依次彈出s2中的元素並輸出,結果的逆序即為中綴表示式對應的字尾表示式。

運算子優先順序: 左括號》(乘=除)>(加=減)>右括號  為了程式設計方便假定右括號優先順序最小。

例:將 1 + ( ( 23 + 34 ) * 5 ) - 6轉化為中綴表示式

所以計算結果為:1 # 2 3 # 3 4 # + 5 # * + 6 # -

2.字尾表示式計算方法:

(1)定義乙個int棧s3,定義乙個整形陣列num用來儲存大於10的數字便於計算,從左至右掃瞄表示式。

(2)遇到數字時:

(2-1)若數字後面乙個元素不是#(數字後面只可能是#或數字)則將數字字元轉化為數字存在num[ ]陣列中;

(2-2)若數字後面乙個元素是#,將num陣列中儲存的數字算出來並壓入s3棧中。

(3)遇到運算子時,彈出s3棧頂的兩個數,用運算子對它們做相應的計算(次頂元素 op 棧頂元素),並將結果入棧;重複上述過程直到表示式最右端,最後運算得出的值即為表示式的結果。

例如字尾表示式「1 # 2 3 # 3 4 # + 5 # * + 6 # -」:

藍橋杯 演算法訓練 表示式計算

之前在學習棧的時候老師講過這個問題 思路就是 1.將表示式 中綴式 轉化成字尾式 2.進行字尾式的計算。思路看起來很簡單,但是實際在敲 的時候還是要注意很多問題。下面分享一下個人做法,可以改進之處還希望大家可以指出來,共同進步!一 將中綴式轉化為字尾式 個人採用的是邊輸入邊進行處理 首先設定兩個棧,...

藍橋杯 演算法訓練 表示式計算 (python實現)

class stack object 初始化棧為空列表 def init self self.items 判斷棧是否為空,返回 true 或 false defis empty self return self.items 壓棧,新增新元素進棧 defpush self,item 出棧,刪除棧頂元素...

藍橋杯習題集 演算法訓練 字首表示式

原文 演算法訓練 字首表示式 時間限制 1.0s 記憶體限制 512.0mb 問題描述 編寫乙個程式,以字串方式輸入乙個字首表示式,然後計算它的值。輸入格式為 運算子 物件1 物件2 其中,運算子為 加法 減法 乘法 或 除法 運算物件為不超過10的整數,它們之間用乙個空格隔開。要求 對於加 減 乘...