今天浙江理工校赛的D题。
比赛结束后在网上看了文章才做出来的。
还记得大学里学过的模电么,今天就让我们将与或非变成一道题吧。
给你一个与或非的表达式,求出这个表达式的值,表达式总共有八种字符。
三种逻辑运算符按照优先级排列如下。
‘!’:表示取反。
‘&’:逻辑与。
‘|’:逻辑或。
两个字符‘T’,‘F‘分别表示true和 false。
另外还有左右括号,空格三种字符。跟一般的表达式一样,括号可以改变优先级。
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const double PI = acos(-1.0);
const double e = 2.718281828459;
const double eps = 1e-8;
const int MAXN = 110;
char s[MAXN];
char opset[6] = {'!','&','|','(',')','#'};
char prio[6][6] =
{
'>', '>', '>', '<', '>', '>',
'<', '>', '>', '<', '>', '>',
'<', '<', '>', '<', '>', '>',
'<', '<', '<', '<', '=', '>',
'>', '>', '>', '<', '>', '>',
'<', '<', '<', '<', '>', '=',
};
//找到对应运算符在 opset 数组的下标
int findindex(char op)
{
for(int i = 0; i < 6; i++)
{
if(opset[i] == op)
return i;
}
}
//比较Q栈顶元素与当前s[i]中运算符的优先级
char compare(char a, char b)
{
int x = findindex(a);
int y = findindex(b);
return prio[x][y];
}
//计算 x y 在op运算符下的结果
int calc(int x, int y, char op)
{
if(op == '|')
return x|y;
if(op == '&')
return x&y;
return 0;
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
while(scanf("%s", s) != EOF)
{
int lens = strlen(s);
s[lens] = '#'; // s 数组尾部存为'#'
s[lens+1] = '