題目:
給定乙個表示式,該表示式由以下規則生成:
1.「0」和「1」是合法表示式;
2.如果x是乙個合法表示式,那麼「(!x)」是乙個合法表示式;
3.如果x和y是合法表示式,那麼「(x|y)」和「(x&y)」都是乙個合法表示式;
其中,!是邏輯非操作符,|和&分別是與運算子和或運算子,給定乙個合法表示式,求該表示式最終的值。
輸入描述:
第一行是乙個整數t(t<=20)。接下來t行,每一行是乙個合法表示式。表示式不含空格,且輸入保證該表示式是乙個合法表示式。
對於30%的資料,表示式的長度不超過500;對於100%的資料,表示式的長度不超過150000。
輸出描述:
t行,每一行表示相應表示式的值。
示例:輸入:
(!0)
(0|(1&0))
(0|(1&(!0)))
輸出:思路:建立兩個棧,每當遇到非數字字元時,除了符號')',全部壓入第乙個棧中,當遇到數字時,壓入第二個棧;當遇到符號')'時,則從第二個棧中彈出棧頂數字,第乙個棧彈出符號,直到第乙個棧彈出的是符號'('為止,則退出這輪計算,最後把計算結果壓入第二個數字棧中,以備下次繼續計算。
**:
#include #include #include using namespace std;
//注意:這個**的執行前提條件是這個表示式合法,這裡根據測試用例測試,就不多加考慮
int count_number(char * str)
else if(*str == '0' || *str == '1')
else if(*str == ')')//遇到')'進行棧內資料和符號計算
else if(tmp1 == '&')
else if(tmp1 == '!')
tmp1 = stack1.top();
stack1.pop();
}stack2.push(a);//將這一次的計算結果壓入數字棧stack2中,以備下次繼續計算
}str++;
} return (stack2.top());
}int main()
cout<<"結果:"
}
網易測評題 表示式求值
今天上課,老師教了小易怎麼計算加法和乘法,乘法的優先順序大於加法,但是如果乙個運算加了括號,那麼它的優先順序是最高的。例如 12 341 23 7 1 2 3 5 123 6 1 2 3 9 現在小易希望你幫他計算給定3個數a,b,c,在它們中間新增 符號,能夠獲得的最大值。輸入描述 一行三個數a,...
表示式求值(2019網易程式設計題)
今天上課,老師教了小易怎麼計算加法和乘法,乘法的優先順序大於加法,但是如果乙個運算加了括號,那麼它的優先順序是最高的。例如 1 2 3 4 1 2 3 7 1 2 3 5 1 2 3 6 1 2 3 9 現在小易希望你幫他計算給定3個數a,b,c,在它們中間新增 符號,能夠獲得的最大值。輸入描述 一...
程式設計題 奇怪的表示式求值
常規的表示式求值,我們都會根據計算的優先順序來計算。比如 的優先順序就高於 但是小易所生活的世界的表示式規則很簡單,從左往右依次計算即可,而且小易所在的世界沒有除法,意味著表示式中沒有 只有 和 現在給出乙個表示式,需要你幫忙計算出小易所在的世界這個表示式的值為多少 輸入描述 輸入為一行字串,即乙個...