zoukankan      html  css  js  c++  java
  • 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] = '';
                        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, '', 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

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

    注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
  • 相关阅读:
    [Kafka]
    [Kafka]
    [数据挖掘]
    接口部署说明
    报表部署安装说明
    kafka单机安装测试-原创-本机测试过
    centos安装nginx 带upstream
    spring boot jpa mysql porm文件备份 可以运行的
    Spring boot jpa mysql 连接数据库SSL错误
    mysql 学习笔记
  • 原文地址:https://www.cnblogs.com/yalphait/p/8017859.html
Copyright © 2011-2022 走看看