布尔表达式----栈

题目:
描述
输入一个布尔表达式,请你输出它的真假值。
比如:( V | V ) & F & ( F | V )
V表示true,F表示false,&表示与,|表示或,!表示非。
上式的结果是F

输入
输入包含多行,每行一个布尔表达式,表达式中可以有空格,总长度不超过1000
输出
对每行输入,如果表达式为真,输出"V",否则出来"F"

// ConsoleApplication3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<stack>
#include<string>
using namespace std;
char calculate(char x, char y, char oper) { // 计算 x oper y 
	bool a = (x == 'V'), b = (y == 'V'), ans;
	if (oper == '|')ans = (a || b);
	else if (oper == '&')ans = (a&&b);
	return ans ? 'V' : 'F';
}
char reverse(char x) {
	if (x == 'V')return 'F';
	return 'V';
}
int main() {
	string in;
	int i, j, len;

	while (getline(cin, in)) {
		stack< char > Oper, num; //oper保存运算符,num保存运算结果 
		queue< char > s;  	//	s就是前缀表达式 
		len = in.length();
		i = len;
		in = " " + in;
		while (i > 0) {  // 从右往左,中缀表达式转 前缀表达式 
			if (in[i] == ' ') {
				i--;continue;
			}
			else if (isalpha(in[i]))s.push(in[i--]);
			else if (in[i] == '!')  	//最高级的运算,直接进入表达式 
				s.push(in[i--]);
			else {
				if (in[i] == '&' || in[i] == '|' || in[i] == ')')  //低级运算,进栈 
					Oper.push(in[i--]);
				else if (in[i] == '(') {  //一个括号结束,弹出中间的所有运算符 
					while (Oper.top() != ')') {
						s.push(Oper.top());
						Oper.pop();
					}
					Oper.pop();i--;
				}
			}
		}
		while (!Oper.empty())  	//栈中剩下的运算符 
			s.push(Oper.top()), Oper.pop();
		while (!s.empty()) {   	//计算前缀表达式 
			char ch = s.front();s.pop();
			if (isalpha(ch))num.push(ch);
			else Oper.push(ch);
			if (!num.empty() && !Oper.empty() && Oper.top() == '!') {  //单目运算符‘!’; 
				char x = num.top();
				num.pop();Oper.pop();
				num.push(reverse(x));
			}
			else if (num.size() >= 2 && !Oper.empty()) {  	//双目运算符 
				char oper = Oper.top(), x, y;
				Oper.pop();
				x = num.top();num.pop();
				y = num.top();num.pop();
				num.push(calculate(x, y, oper));
			}
		}
		cout << num.top() << endl;
	}
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值