逻辑计算器:
题目描述:
常用的逻辑计算&,|,!三种。
优先级:!>&>|
输入描述:
输入只有0,1,&,|,!五种字符;
测试用例长度不超过128字符,无空格;
括号可以重复嵌套;
输出描述:
0或1
应用双栈操作
代码:
package com.exercise;
import java.util.Scanner;
import java.util.Stack;
public class Huawei21 {
public static void main(String[] args){
Stack<Object> shu=new Stack<Object>();
Stack<Object> fu=new Stack<Object>();
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
char[] ch=new char[s.length()];
for(int i=0;i<s.length();i++) {
ch[i]=s.charAt(i);
}
int flag=0;
for(int i=0;i<ch.length;i++) {
if((ch[i])=='1'|(ch[i])=='0') {
shu.add(ch[i]);
while((i==ch.length-1)&(!fu.isEmpty())) {
char popfu=(char) fu.pop();
if(popfu=='!') {
char a1=(char) shu.pop();
a1=(a1=='0'?'1':'0');
shu.add(a1);
}
else if(popfu=='&') {
char b1=(char) shu.pop();
char b2=(char) shu.pop();
char o1=((b1=='1'&b2=='1')?'1':'0');
shu.add(o1);
}
else if(popfu=='|') {
char b1=(char) shu.pop();
char b2=(char) shu.pop();
char o1=((b1=='0'&b2=='0')?'0':'1');
shu.add(o1);
}
}
}
else if(isFu(ch[i])&(flag==0)) {
fu.add(ch[i]);
flag++;
}
else if((flag!=0)&&isFu(ch[i])) {
if((ch[i]!='(')&&(ch[i]!=')')&&((char) fu.peek()<=ch[i])) {
char popfu=(char) fu.pop();
if(popfu=='!') {
char a1=(char) shu.pop();
a1=(a1=='0'?'1':'0');
shu.add(a1);
fu.add(ch[i]);
}
else if(popfu=='&') {
char b1=(char) shu.pop();
char b2=(char) shu.pop();
char o1=((b1=='1'&b2=='1')?'1':'0');
shu.add(o1);
fu.add(ch[i]);
}
else if(popfu=='|') {
char b1=(char) shu.pop();
char b2=(char) shu.pop();
char o1=((b1=='0'&b2=='0')?'0':'1');
shu.add(o1);
fu.add(ch[i]);
}
}else if(((char) fu.peek()>ch[i])&(ch[i]!='(')&(ch[i]!=')')){
fu.add(ch[i]);
}
else if(ch[i]=='(') {
fu.add(ch[i]);
}
else if(ch[i]==')') {
if((char) fu.peek()=='(') {
fu.pop();
}
else if((char) fu.peek()!='(') {
char popfu=(char) fu.pop();
if(popfu=='!') {
char a1=(char) shu.pop();
a1=(a1=='0'?'1':'0');
shu.add(a1);
fu.pop();
}
else if(popfu=='&') {
char b1=(char) shu.pop();
char b2=(char) shu.pop();
char o1=(((b1=='1')&(b2=='1'))?'1':'0');
shu.add(o1);
fu.pop();
}
else if(popfu=='|') {
char b1=(char) shu.pop();
char b2=(char) shu.pop();
char o1=(((b1=='0')&(b2=='0'))?'0':'1');
shu.add(o1);
fu.pop();
}
}
}
}
}
System.out.print(shu);
}
public static boolean isFu(char b) {
int temp=(char) b;
switch(temp) {
case 33:
case 38:
case 40:
case 41:
case 124:
return true;
default:
return false;
}
}
}
测试用例:
/*!(1&0)|0&1 1
!(1&0)&0|0 0*/
hw2