- 总时间限制: 1000ms 内存限制: 65536kB
- 描述
- The objective of the program you are going to produce is to evaluate boolean expressions as the one shown next:
- where V is for True, and F is for False. The expressions may include the following operators: ! for not , & for and, | for or , the use of parenthesis for operations grouping is also allowed.
- To perform the evaluation of an expression, it will be considered the priority of the operators, the not having the highest, and the or the lowest. The program must yield V or F , as the result for each expression in the input file.
- 输入
- The expressions are of a variable length, although will never exceed 100 symbols. Symbols may be separated by any number of spaces or no spaces at all, therefore, the total length of an expression, as a number of characters, is unknown.
- The number of expressions in the input file is variable and will never be greater than 20. Each expression is presented in a new line, as shown below.
- 输出
- For each test expression, print "Expression " followed by its sequence number, ": ", and the resulting value of the corresponding test expression. Separate the output for consecutive test expressions with a new line.
- Use the same format as that shown in the sample output shown below.
- 样例输入
( V | V ) & F & ( F| V) !V | V & V & !F & (F | V ) & (!F | F | !V & V) (F&F|V|!V&!F&!(F|F&V))
样例输出
Expression 1: F Expression 2: V Expression 3: V
解题思路
一开始看到这题就觉得要用栈,毕竟是表达式求值问题,但是自己的中缀表达式求值也没练过,而且这次的课程作业又是练习递归,于是就尝试了递归解法。
但是入门太浅,还是搞不懂递归思路,很难从一个表达式中进行结构的分解,逻辑梳理能力太差。
下面是大佬的代码,真心膜拜,希望我的代码能力能越来越好。
#include<iostream> using namespace std; bool f1(); bool f2(); char getc_() //读入一个非空格字符 { char c; while ((c = cin.get()) == ' '); return c; } char peekc_()//读到第一个非空格字符前停止 { char c; while ((c = cin.peek()) == ' ') { cin.get(); } return c; } bool f2()//计算项 { char c = peekc_(); if (c == '(') { getc_(); //拿走左括号 bool d = f1(); getc_(); //拿走右括号 return d; } else { getc_(); if (c == '!') return !f2();//运算符作用于下一个对象 if (c == 'V') return true; if (c == 'F') return false; } } bool f1()//计算整个表达式 { char c = peekc_(); if (c == ' ') return false; bool a = f2(); while (true) { c = peekc_(); if (c == '|') { getc_(); bool b = f2(); a = a || b; } else if (c == '&') { getc_(); bool b = f2(); a = a && b; } else break; } return a; } int main() { int n = 0; while (cin.peek() != EOF) { bool f = f1(); if (cin.peek() == ' ' || cin.peek() == EOF) { cout << "Expression " << ++n << ": " << (f ? 'V' : 'F') << endl; cin.get();//清理换行符和结束符 } } return 0; }
引用网址:
https://blog.csdn.net/chuxin126/article/details/55105076