17.12.10 布尔表达式

布尔表达式

描述
输入一个布尔表达式,请你输出它的真假值。 
比如:( 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
#include <iostream>
#include <string.h>
#include <memory>
using namespace std;
char str[1500], equ[1500];
char sign[1000];
int num[1000];
int s = 0, n = 0, co = 0;         //定义s,n,co,分别为当前指向的sign数组中符号的位置,num数组中数字的位置,equ数组中元素的位置
void cal()           //设定一个函数cal用以两个数之间的计算,并且赋值到前一个数,并相应改变指向位置
{
    if (sign[s - 1] == '*')
    {
        num[n - 2] = num[n - 1] * num[n - 2];
        n = n - 1;
        s--;
    }
    else if (sign[s - 1] == '+')
    {
        num[n - 2] = num[n - 1] + num[n - 2];
        n = n - 1;
        s--;
    }
}
int solve()     //定义一个solve函数用来 对算式进行处理 遇到数字放入num中 遇到符号 如果是运算符 比较其与sign中前一个放入的符号的优先级 如果是左括号 放入sign中  调用cal计算 递归
{
    if (co == strlen(equ) && s == 0)        //出口是遍历了算式中每一个元素并且sign中的符号都用光了
        return num[0];
    if (equ[co] <= '9'&&equ[co] >= '0')
    {
        num[n++] = equ[co++] - '0';
        return solve();
    }
    else
    {
        if (co <= strlen(equ) - 1)
        {
            if (s == 0 || equ[co] == '(')
            {
                sign[s++] = equ[co++];
                return solve();
            }
            else
            {
                if (equ[co] == ')')
                {
                    while (sign[s - 1] != '(')
                        cal();
                    sign[s - 1] = '\0';
                    s--;
                    co++;
                }
                else if (equ[co] < sign[s - 1])
                    sign[s++] = equ[co++];
                else if (sign[s - 1] == '(')
                {
                    sign[s++] = equ[co++];
                }
                else
                {
                    cal();
                    sign[s++] = equ[co++];
                }
            }
        }
        else if (s >= 0)
            cal();
    }
    return solve();
}
int main()
{
    while (cin.getline(str, 1500))
    {
        memset(equ, '\0', 1500);  //清空equ
        s = 0, n = 0, co = 0;
        int flag = 0;
        int len = strlen(str);
        for (int i = 0, j = 0; i <= len - 1; i++, j++)  //一下对bool式进行处理 转化为中缀式 V->1 F->0 |->+ &->*
        {
            if (str[i] == '!')
            {
                flag++;
                j--;
            }
            else if (str[i] == 'V')
            {
                if (flag % 2 == 0 && flag != 0)
                {
                    equ[j] = '1';
                    flag = 0;
                }
                else if (flag % 2 != 0)
                {
                    equ[j] = '0';
                    flag = 0;
                }
                else
                    equ[j] = '1';
            }
            else if (str[i] == 'F')
            {
                if (flag % 2 == 0 && flag != 0)
                {
                    equ[j] = '0';
                    flag = 0;
                }
                else if (flag % 2 != 0)
                {
                    equ[j] = '1';
                    flag = 0;
                }
                else
                    equ[j] = '0';
            }
            else if (str[i] == ' ')
                j--;
            else if (str[i] == '|')
                equ[j] = '+';
            else if (str[i] == '&')
                equ[j] = '*';
            else
                equ[j] = str[i];
        }
        if (solve())
            cout << 'V' << endl;
        else
            cout << 'F' << endl;
    }
}
View Code

困扰了我很长时间的题目

从一开始就选择了先把bool式化成中缀表达式计算的方法 而助教又不是这么做的 十分崎岖

到最后已经发展成“我就不信用中缀表达式就不能做了”的执念orz

中缀表达式对计算机来说果然很复杂啊~

posted @ 2017-12-10 19:48  TobicYAL  阅读(594)  评论(0编辑  收藏  举报