java中应用Stack进行算术运算的操作
java.util.stack,继承自Vector
FILO,适合带有小括号的算术运算
importjava.util.Stack; /** *利用栈,进行四则运算的类 *用两个栈来实现算符优先,一个栈用来保存需要计算的数据numStack,一个用来保存计算优先符priStack * *基本算法实现思路为:用当前取得的运算符与priStack栈顶运算符比较优先级:若高于,则因为会先运算,放入栈顶; *若等于,因为出现在后面,所以会后计算,所以栈顶元素出栈,取出操作数运算; *若小于,则同理,取出栈顶元素运算,将结果入操作数栈。各个优先级'('>'*'='/'>'+'='-'>')' * */ publicclassOperate{ privateStackpriStack=newStack ();//操作符栈 privateStack numStack=newStack ();;//操作数栈 /** *传入需要解析的字符串,返回计算结果(此处因为时间问题,省略合法性验证) *@paramstr需要进行技术的表达式 *@return计算结果 */ publicintcaculate(Stringstr){ //1.判断string当中有没有非法字符 Stringtemp;//用来临时存放读取的字符 //2.循环开始解析字符串,当字符串解析完,且符号栈为空时,则计算完成 StringBuffertempNum=newStringBuffer();//用来临时存放数字字符串(当为多位数时) StringBufferstring=newStringBuffer().append(str);//用来保存,提高效率 while(string.length()!=0){ temp=string.substring(0,1); string.delete(0,1); //判断temp,当temp为操作符时 if(!isNum(temp)){ //1.此时的tempNum内即为需要操作的数,取出数,压栈,并且清空tempNum if(!"".equals(tempNum.toString())){ //当表达式的第一个符号为括号 intnum=Integer.parseInt(tempNum.toString()); numStack.push(num); tempNum.delete(0,tempNum.length()); } //用当前取得的运算符与栈顶运算符比较优先级:若高于,则因为会先运算,放入栈顶;若等于,因为出现在后面,所以会后计算,所以栈顶元素出栈,取出操作数运算; //若小于,则同理,取出栈顶元素运算,将结果入操作数栈。 //判断当前运算符与栈顶元素优先级,取出元素,进行计算(因为优先级可能小于栈顶元素,还小于第二个元素等等,需要用循环判断) while(!compare(temp.charAt(0))&&(!priStack.empty())){ inta=(int)numStack.pop();//第二个运算数 intb=(int)numStack.pop();//第一个运算数 charope=priStack.pop(); intresult=0;//运算结果 switch(ope){ //如果是加号或者减号,则 case'+': result=b+a; //将操作结果放入操作数栈 numStack.push(result); break; case'-': result=b-a; //将操作结果放入操作数栈 numStack.push(result); break; case'*': result=b*a; //将操作结果放入操作数栈 numStack.push(result); break; case'/': result=b/a;//将操作结果放入操作数栈 numStack.push(result); break; } } //判断当前运算符与栈顶元素优先级,如果高,或者低于平,计算完后,将当前操作符号,放入操作符栈 if(temp.charAt(0)!='#'){ priStack.push(newCharacter(temp.charAt(0))); if(temp.charAt(0)==')'){//当栈顶为'(',而当前元素为')'时,则是括号内以算完,去掉括号 priStack.pop(); priStack.pop(); } } }else //当为非操作符时(数字) tempNum=tempNum.append(temp);//将读到的这一位数接到以读出的数后(当不是个位数的时候) } returnnumStack.pop(); } /** *判断传入的字符是不是0-9的数字 * *@paramstr *传入的字符串 *@return */ privatebooleanisNum(Stringtemp){ returntemp.matches("[0-9]"); } /** *比较当前操作符与栈顶元素操作符优先级,如果比栈顶元素优先级高,则返回true,否则返回false * *@paramstr需要进行比较的字符 *@return比较结果true代表比栈顶元素优先级高,false代表比栈顶元素优先级低 */ privatebooleancompare(charstr){ if(priStack.empty()){ //当为空时,显然当前优先级最低,返回高 returntrue; } charlast=(char)priStack.lastElement(); //如果栈顶为'('显然,优先级最低,')'不可能为栈顶。 if(last=='('){ returntrue; } switch(str){ case'#': returnfalse;//结束符 case'(': //'('优先级最高,显然返回true returntrue; case')': //')'优先级最低, returnfalse; case'*':{ //'*/'优先级只比'+-'高 if(last=='+'||last=='-') returntrue; else returnfalse; } case'/':{ if(last=='+'||last=='-') returntrue; else returnfalse; } //'+-'为最低,一直返回false case'+': returnfalse; case'-': returnfalse; } returntrue; } publicstaticvoidmain(Stringargs[]){ Operateoperate=newOperate(); intt=operate.caculate("(3+4*(4*10-10/2)#"); System.out.println(t); } }
补充:javastack实现的中缀简单四则运算表达式计算
我就废话不多说了,大家还是直接看代码吧~
publicabstractclassStack{ publicabstractbooleanisEmpty(); publicabstractbooleanisFull(); publicabstractTtop(); publicabstractbooleanpush(Tx); publicabstractTpop(); publicabstractvoidclear(); }
publicclassSeqStackextendsStack { privateObject[]elementData; privateintmaxTop; privateinttop; publicSeqStack(intsize){ this.maxTop=size-1; elementData=newObject[size]; top=-1; } @Override publicbooleanisEmpty(){ returntop==-1; } @Override publicbooleanisFull(){ returntop==maxTop-1; } @SuppressWarnings("unchecked") @Override publicTtop(){ if(top==-1){ System.out.println("Empty"); returnnull; } return(T)elementData[top]; } @Override publicbooleanpush(Tx){ if(top==maxTop){ System.err.println("Full"); returnfalse; } elementData[++top]=x; returntrue; } @SuppressWarnings("unchecked") @Override publicTpop(){ if(top==-1){ System.err.println("Empty"); returnnull; } Tresult=(T)elementData[top]; elementData[top]=null;//gc top--; returnresult; } @Override publicvoidclear(){ //letgcdoitswork for(inti=0;i publicclassStackCalc{ privateSeqStackstack; publicStackCalc(intmaxSize){ stack=newSeqStack (maxSize); } privatevoidpushOperand(Integernumber){ stack.push(number); } privateNumberdoOperate(charoper){ Integerright=stack.pop(); Integerleft=stack.pop(); Integerresult=null; if(left!=null&&right!=null){ switch(oper){ case'+': result=left.intValue()+right.intValue(); break; case'-': result=left.intValue()-right.intValue(); break; case'*': result=left.intValue()*right.intValue(); break; case'/': if(right.intValue()==0){ System.err.println("Divideby0"); } result=left.intValue()/right.intValue(); break; default: break; } } stack.push(result); returnresult; } privateinticp(charc){ switch(c){ case'#': return0; case'(': return7; case'*': return4; case'/': return4; case'+': return2; case'-': return2; case')': return1; default: return-1; } } privateintisp(intc){ switch(c){ case'#': return0; case'(': return1; case'*': return5; case'/': return5; case'+': return3; case'-': return3; case')': return7; default: return-1; } } publicStringtransfer(Stringexpression){ StringBuildersb=newStringBuilder(); SeqStack stack=newSeqStack (expression.length()); stack.push('#'); for(inti=0;i isp(stack.top())){//进栈 stack.push(c); }else{//出栈 if(c==')'){ charch=stack.pop(); while(ch!='('){ sb.append(ch); ch=stack.pop(); } }else{ charch=stack.pop(); while(icp(c)<=isp(ch)){ sb.append(ch); ch=stack.pop(); } stack.push(ch); stack.push(c); } } } }//endoffor charch=stack.pop(); while(ch!='#'){ sb.append(ch); ch=stack.pop(); } stack.clear(); returnsb.toString(); } publicIntegercalc(Stringexpression){ expression=transfer(expression); for(inti=0;i 以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。