逻辑运算求助首先我用'&'表示与, '|'表示或有这样一个公式: (A&B)|(C&D)现在想解开这个括号, 就是求一个不带括号的算式, 而计算优先级是需要从左到右的, 也就是说如果结果是A&B|C&D, 那么就相当于带括号的((A&B)|C)&D, 当然, 这个结果肯定是不对的.求高人解答
问题描述:
逻辑运算求助
首先我用'&'表示与, '|'表示或
有这样一个公式: (A&B)|(C&D)
现在想解开这个括号, 就是求一个不带括号的算式, 而计算优先级是需要从左到右的, 也就是说如果结果是A&B|C&D, 那么就相当于带括号的((A&B)|C)&D, 当然, 这个结果肯定是不对的.
求高人解答
答
A&B|D&C
&优先于|
答
一般来说,如果认为&和|两个运算的优先级相同的话,则你的问题是无解的,也就是说,无法将
(A&B)|(C&D)转换为不带括号的形式.
当然,有两种方式可以转换该问题,
1.定义&和|的优先级,
1.1 如果认为&的优先级高,则可以直接将上面表达式的括号去掉
1.2 如果认为|优先级高.则根据公式 (X&Y)|Z = (X|Z) & (Y|Z),上面表达式可以化为
A|C & B|C & A|D & B|D
另外一种形式是使用后缀表达式.这个可以上网搜一下,一般计算机计算时,都会先转换为后缀表达式,将括号删除.比如(2 + 1) * 3 ,其后缀表达式为:2 1 + 3 *
(A&B)|(C&D)的后缀表达式为AB&CD&|,实际上编译器在计算复杂表达式时,就是将所有表达式都转换为了后缀表达式在生成机器码的.
运用后缀表达式进行计算的具体做法:
建立一个栈S .从左到右读后缀表达式,如果读到操作数就将它压入栈S中,如果读到n元运算符(即需要参数个数为n的运算符)则取出由栈顶向下的n项按操作符运算,再将运算的结果代替原栈顶的n项,压入栈S中 .如果后缀表达式未读完,则重复上面过程,最后输出栈顶的数值则为结束.