這個題學了資料結構之後其實非常簡單。
就乙個運算子棧digit,乙個操作符棧op.
那麼邏輯是,如果是數字,直接進數字棧。
如果是操作符
如果棧頂優先順序高於當前操作符。那麼先讓digit棧的棧頂兩元素做當前運算。然後op棧頂彈出,直到棧頂元素的優先順序小於當前的操作符,所以這裡需要加上乙個迴圈。而不是簡單的乙個if
然後就很簡單了,思路指導**。我這個**寫的有點不是很好看,湊合看吧。另外有個要注意的地方就是,這裡的那個*不是* 而是x。
在這裡我簡單介紹一下我的函式preceed,這個是判斷優先順序的函式,第一引數表示棧頂操作符,第二引數表示當前操作符。
細心的注意到了這裡最開始的時候s+='#'.
而且操作符棧op.push('#').
如果是最後乙個怎麼判斷它已經完了呢?如果是棧底第乙個怎麼判斷它的優先順序呢?就靠這個#來進行標識,棧裡的#優先順序是最低的。這個,害,好像不是很好描述。就編譯原理裡面也有這種思想。自己模擬一下就能夠理解了,我覺得幹這種事不應該著急著打**的,,而是先模擬一下過程清楚思路
#include#include#includeusing namespace std;
char preceed(char a,char b);
int main()
else else else if(op.top() == '-')else if(op.top() == 'x')else if(op.top() == '/')
op.pop();
}op.push(s[i]);}}
} if(!digit.empty() && digit.top() == 24)else
}return 0;
} char preceed(char a,char b)
case 'x':
case '/':
return '>';
}}
ccf201903 2二十四點
二十四點 使用 3 個加減乘除運算使得 4張紙牌上數字的運算結果為 24。定義每乙個遊戲由 4 個從 1 9 的數字和 3個四則運算符組成,保證四則運算符將數字兩兩隔開,不存在括號和其他字元,運算順序按照四則運算順序進行。其中加法用符號 表示,減法用符號 表示,乘法用小寫字母 x 表示,除法用符號 ...
CCF 201903 2二十四點
棧的簡單應用,中綴表示式的計算。分兩步進行 定義操作符的優先順序,用棧將中綴表示式轉為字尾表示式。再次用棧計算字尾表示式的值。注意 這裡只有加減乘除沒有括號,可以不特意定義優先順序陣列。數字是1 9,直接將數字字元轉成數字即可,不會有大於10的數字。除法是去尾整除,計算過程不會出現小數,都是整數。c...
CCF 201903 2 二十四點
分析乘除的優先順序高於加減,因此應該先計算乘除的部分,然後再將各部分加減起來。也就是將表示式先拆解成不含加減的子式,然後計算出各個子式的值累加起來即可。用分治的策略比較簡單好寫,過程如下 對於一段表示式,如果含有加減運算子,則將表示式從運算子拆解成左右兩個子式求解。遞迴分解直到所有子表示式都不含有加...