题目来源:http://noi.openjudge.cn/ch0303/6263/
6263:布尔表达式
总时间限制: 1000ms 内存限制: 65536kB
描述
输入一个布尔表达式,请你输出它的真假值。
比如:( V | V ) & F & ( F | V)
V表示true,F表示false,&表示与,|表示或,!表示非。
上式的结果是F
输入
输入包含多行,每行一个布尔表达式,表达式中可以有空格,总长度不超过1000
输出
对每行输入,如果表达式为真,输出"V",否则出来"F"
样例输入
( V | V ) & F & ( F| V)
!V | V & V & !F & (F | V ) & (!F | F | !V & V)
(F&F|V|!V&!F&!(F|F&V))
样例输出
F
V
V
-----------------------------------------------------
思路
我想到的思路是套模板,先把题目所给的中缀表达式化成后缀表达式,再计算后缀表达式的值,具体算法参见我的另一篇博文基于逆波兰表达式的数学表达式计算器(Java版)。当然这一定不是最优解法。
和那篇博文不一样的是,计算布尔表达式涉及单目运算符’!’。对’!’的处理是:从左向右扫描中缀表达式的时候,每次遇到’!’直接入栈operator,不做任何操作,等下一次遇到’&’’|’的时候把’!’出栈operator,入栈operand,就自动把’!’放到操作数的后面去了。
-----------------------------------------------------
代码
#include<iostream> #include<fstream> #include<vector> #include<string> using namespace std; int main() { #ifndef ONLINE_JUDGE ifstream fin ("0303_6263.txt"); vector<char> operand, _operator; vector<bool> ans; char ss[104] = {}; int i,len; char ch,ch1; bool ans1,ans2; while (fin.getline(ss,100)) { operand.clear(); _operator.clear(); ans.clear(); string s(ss); len = s.size(); // 中缀表达式转后缀表达式 for (i=0; i<len; i++) { ch = s.at(i); if (ch=='V' || ch=='F') { operand.push_back(ch); } else if (ch=='(') { _operator.push_back(ch); } else if (ch=='!') { _operator.push_back(ch); } else if (ch=='&' || ch=='|') { if (_operator.empty()) { _operator.push_back(ch); } else if (_operator.back()=='(') { _operator.push_back(ch); } else { while (!_operator.empty() && _operator.back()!='(') { ch1 = _operator.back(); operand.push_back(ch1); _operator.pop_back(); } _operator.push_back(ch); } } else if (ch==')') { while (_operator.back()!='(') { ch1 = _operator.back(); operand.push_back(ch1); _operator.pop_back(); } _operator.pop_back(); } } while (!_operator.empty()) { ch1 = _operator.back(); _operator.pop_back(); operand.push_back(ch1); } // 计算后缀表达式 for (i=0; i<operand.size(); i++) { ch = operand.at(i); if (ch=='V') { ans.push_back(true); } else if (ch=='F') { ans.push_back(false); } else if (ch=='!') { ans1 = ans.back(); ans.pop_back(); ans1 = !ans1; ans.push_back(ans1); } else if (ch=='&') { ans1 = ans.back(); ans.pop_back(); ans2 = ans.back(); ans.pop_back(); ans1 = ans1 && ans2; ans.push_back(ans1); } else if (ch=='|') { ans1 = ans.back(); ans.pop_back(); ans2 = ans.back(); ans.pop_back(); ans1 = ans1 || ans2; ans.push_back(ans1); } } cout << (ans.back()? 'V':'F') << endl; } fin.close(); #endif #ifdef ONLINE_JUDGE vector<char> operand, _operator; vector<bool> ans; char ss[104] = {}; int i,len; char ch,ch1; bool ans1,ans2; while (cin.getline(ss,100)) { operand.clear(); _operator.clear(); ans.clear(); string s(ss); len = s.size(); // 中缀表达式转后缀表达式 for (i=0; i<len; i++) { ch = s.at(i); if (ch=='V' || ch=='F') { operand.push_back(ch); } else if (ch=='(') { _operator.push_back(ch); } else if (ch=='!') { _operator.push_back(ch); } else if (ch=='&' || ch=='|') { if (_operator.empty()) { _operator.push_back(ch); } else if (_operator.back()=='(') { _operator.push_back(ch); } else { while (!_operator.empty() && _operator.back()!='(') { ch1 = _operator.back(); operand.push_back(ch1); _operator.pop_back(); } _operator.push_back(ch); } } else if (ch==')') { while (_operator.back()!='(') { ch1 = _operator.back(); operand.push_back(ch1); _operator.pop_back(); } _operator.pop_back(); } } while (!_operator.empty()) { ch1 = _operator.back(); _operator.pop_back(); operand.push_back(ch1); } // 计算后缀表达式 for (i=0; i<operand.size(); i++) { ch = operand.at(i); if (ch=='V') { ans.push_back(true); } else if (ch=='F') { ans.push_back(false); } else if (ch=='!') { ans1 = ans.back(); ans.pop_back(); ans1 = !ans1; ans.push_back(ans1); } else if (ch=='&') { ans1 = ans.back(); ans.pop_back(); ans2 = ans.back(); ans.pop_back(); ans1 = ans1 && ans2; ans.push_back(ans1); } else if (ch=='|') { ans1 = ans.back(); ans.pop_back(); ans2 = ans.back(); ans.pop_back(); ans1 = ans1 || ans2; ans.push_back(ans1); } } cout << (ans.back()? 'V':'F') << endl; } #endif }