问题描述
每个表达式除括号体外,运算符只可能会出现一种(OR或AND)以下是举例了6个表达式,请问如果可以通过高效的算法来确认是OR还是AND运算表达式,并把每个子表达式放入数组中?(1)Express1ORExpress2是OR运算表达式,子表达式放入数组如下:Str[0]=Express1Str[1]=Express2(2)Express1OR(Express2ANDExpress3)是OR运算表达式,子表达式放入数组如下:Str[0]=Express1Str[1]=(Express2ANDExpress3)(3)Express1ORExpress2ORExpress3OR(Express4ANDExpress5)是OR运算表达式,子表达式放入数组如下:Str[0]=Express1Str[1]=Express2Str[2]=Express3Str[3]=(Express4ANDExpress5)(4)Express1ANDExpress2是AND运算表达式,子表达式放入数组如下:Str[0]=Express1Str[1]=Express2(5)Express1ORExpress2ORExpress3ORExpress4ORExpress5是OR运算表达式,子表达式放入数组如下:Str[0]=Express1Str[1]=Express2Str[2]=Express3Str[3]=Express4Str[4]=Express5(6)(Express1ANDExpress2)OR(Express3ANDExpress4)是OR运算表达式,子表达式放入数组如下:Str[0]=(Express1ANDExpress2)Str[1]=(Express3ANDExpress4)(5)Express1ORExpress2ORExpress3ORExpress4ORExpress5是OR运算表达式,子表达式放入数组如下:Str[0]=Express1Str[1]=Express2Str[2]=Express3Str[3]=Express4Str[4]=Express5(6)(Express1ANDExpress2)OR(Express3ANDExpress4)是OR运算表达式,子表达式放入数组如下:Str[0]=(Express1ANDExpress2)Str[1]=(Express3ANDExpress4)
解决方案
解决方案二:
求解决思路和方法?急!!!
解决方案三:
如果看过数据结构上的四则运算求值的算法,做这个就很简单:逆波兰式
解决方案四:
引用2楼Inhibitory的回复:
如果看过数据结构上的四则运算求值的算法,做这个就很简单:逆波兰式
能给出解析实例方法吗?先谢了
解决方案五:
这个很简单啦,首先括号体内的肯定是一个单独的表达式,所以可以分两步:1、先将所有的括号体提取出来,记为子表达式2、将剩下的表达式进行split("and")或者split("or"),这样分割出来的肯定也是子表达式了
解决方案六:
引用3楼u014388068的回复:
Quote: 引用2楼Inhibitory的回复:
如果看过数据结构上的四则运算求值的算法,做这个就很简单:逆波兰式能给出解析实例方法吗?先谢了
这个网上搜索很多的http://leon-a.iteye.com/blog/186104
解决方案七:
引用4楼dokia123的回复:
这个很简单啦,首先括号体内的肯定是一个单独的表达式,所以可以分两步:1、先将所有的括号体提取出来,记为子表达式2、将剩下的表达式进行split("and")或者split("or"),这样分割出来的肯定也是子表达式了
如果是括号里面再套括号呢?
解决方案八:
试试正则表达式,先把括号里面的and,or替换成其他特殊字符,再用split分割,完了再把and,or换回来。
解决方案九:
引用6楼u014388068的回复:
Quote: 引用4楼dokia123的回复:
这个很简单啦,首先括号体内的肯定是一个单独的表达式,所以可以分两步:1、先将所有的括号体提取出来,记为子表达式2、将剩下的表达式进行split("and")或者split("or"),这样分割出来的肯定也是子表达式了如果是括号里面再套括号呢?
针对以下表达式,字符串.split("AND")会产生错乱的现象.(Express1ANDExpress2)AND(Express3ANDExpress4)
解决方案十:
如果表达式变成以下情况,字符串.split("OR")就可以分割成两个表达式:(1)(Express1ANDExpress2)(2)(Express3ANDExpress4)(Express1ANDExpress2)OR(Express3ANDExpress4)
解决方案十一:
引用6楼u014388068的回复:
Quote: 引用4楼dokia123的回复:
这个很简单啦,首先括号体内的肯定是一个单独的表达式,所以可以分两步:1、先将所有的括号体提取出来,记为子表达式2、将剩下的表达式进行split("and")或者split("or"),这样分割出来的肯定也是子表达式了如果是括号里面再套括号呢?
我只是提了下自己的思路撒,而且问题的某些方面你也没说清楚,比如括号里可以套括号,然后这种情况应该处理成什么样。
解决方案十二:
以下是本人写的一个简单的解析分解最小单位表达式和运算表达符号,请大家指点,是否可以优化并写的更高效?先谢了.publicclassexpressionParse{privatestaticintA3(Stringexpress){intflag=0;intpos=0;if(express.indexOf("(")>=0){char[]strs=express.toCharArray();for(inti=0;i<strs.length;i++){if((strs[i])=='(')flag++;elseif(strs[i]==')'){flag--;if(flag==0){pos=i;break;}}}}returnpos;}privatestaticStringA2(Stringexpress){Stringsingle="";if(express.indexOf("(")==0){intpos=A3(express);express=express.substring(pos+1,express.length());}intorPos=express.indexOf("OR");intandPos=express.indexOf("AND");if(orPos!=-1){if(andPos!=-1){if(orPos<andPos)single="OR";elsesingle="AND";}elsesingle="OR";}elseif(andPos!=-1)single="AND";returnsingle;}//无括号子表达式处理方法privatestaticvoidA1(Stringexpress){Stringsingle=A2(express);System.out.println("子表达式:"+express);System.out.println("子表达式操作符:"+single);if("OR".equals(single)){booleanflag=false;String[]strs=express.split("OR");for(inti=0;i<strs.length&&!flag;i++)System.out.println("最小单位表达式:"+strs[i].trim());}elseif("AND".equals(single)){booleanflag=true;String[]strs=express.split("AND");for(inti=0;i<strs.length&&flag;i++)System.out.println("最小单位表达式:"+strs[i].trim());}}privatestaticvoidA4(Stringexpress){StringorAndStr=A2(express);if("OR".equals(orAndStr)){for(inti=express.length();i>0;i=express.length()){if(express.indexOf("(")==0){intpos=A3(express);StringsubExpress=express.substring(1,pos).trim();A4(subExpress);express=express.substring(pos+1,express.length()).trim();if(express.indexOf("OR")==0)express=express.substring(2,express.length()).trim();}elseif(express.indexOf("(")>0){StringsubExpress=express.substring(0,express.indexOf("OR")).trim();A1(subExpress);inta0=express.indexOf("(");intpos=A3(express);express=express.substring(a0+1,pos).trim();}else{if(!"".equals(express)){A1(express);express="";}}}}elseif("AND".equals(orAndStr)){booleanflag=true;for(inti=express.length();i>0&&flag;i=express.length()){if(express.indexOf("(")==0){intpos=A3(express);StringsubExpress=express.substring(1,pos).trim();A4(subExpress);express=express.substring(pos+1,express.length()).trim();if(express.indexOf("AND")==0)express=express.substring(3,express.length()).trim();}elseif(express.indexOf("(")>0){StringsubExpress=express.substring(0,express.indexOf("AND")).trim();A1(subExpress);inta0=express.indexOf("(");intpos=A3(express);express=express.substring(a0+1,pos).trim();}else{if(!"".equals(express)){A1(express);express="";}}}}}publicstaticvoidmain(String[]args){//Stringstr="(Express1AND(Express2ORExpress3))AND(Express4ANDExpress5)";//Stringstr="Express1AND(Express2ANDExpress3)";//Stringstr="Express1OR(Express2ORExpress3)";//Stringstr="Express1ORExpress2ORExpress3";//Stringstr="Express1ANDExpress2ANDExpress3";//Stringstr="(Express1ANDExpress2)AND(Express3ANDExpress4)";//Stringstr="(Express1ANDExpress2)OR(Express3ANDExpress4)";//Stringstr="(Express1OR(Express2ORExpress3))OR(Express4ANDExpress5)";Stringstr="(Express1ANDExpress2)OR(Express3OR(Express4ORExpress6))";//Stringstr="Express1AND(Express2ORExpress3)";System.out.println("表达式:"+str);System.out.println("表达式操作符:"+A2(str));A4(str);}}
解决方案十三:
该方法写的是否合理?是否有更好的思路可解?该解析类调用并发很高,在代码中是否有性能上有更优化的写法?先谢了!
解决方案十四:
引用8楼u014388068的回复:
Quote: 引用6楼u014388068的回复:
Quote: 引用4楼dokia123的回复:
这个很简单啦,首先括号体内的肯定是一个单独的表达式,所以可以分两步:1、先将所有的括号体提取出来,记为子表达式2、将剩下的表达式进行split("and")或者split("or"),这样分割出来的肯定也是子表达式了如果是括号里面再套括号呢?
针对以下表达式,字符串.split("AND")会产生错乱的现象.(Express1ANDExpress2)AND(Express3ANDExpress4)
上面说了啊,分两步,第一步把括号及其内容提取出来,记为一个字表达式;第二步在split。第二步的时候剩下的表达式已经没有括号了,比如表达式expression1and(expression2andexpression3),第一步提取出(expression2andexpression3)记为一个字表达式;第二步时,针对剩下的表达式,即”expression1and“进行split,这样没问题吧?