首页 > 编程知识 正文

用栈实现将中缀表达式转变为后缀,栈表达式求值

时间:2023-05-04 07:04:16 阅读:44377 作者:1521

引入问题:在计算机上,后缀表达式的执行效率高于骑马订表达式,从骑马订表达式到后缀表达式的转换可以在堆栈中实现,但什么是骑马订表达式和后缀表达式呢?

骑马订式的骑马订式其实是我们平时使用的计算式。 例如,a b、a b或更复杂的a bc-d/e

后缀表达式后缀表达式是后跟操作数的运算符表达式。 运算规则遇到运算符并进行与前面两个操作数相对应的运算。 运算符通常是第二个运算符。 这里也以第二个运算符为例。 例如,上面的骑马订表达式将转换为相应的后缀表达式。 分别为ab、ab*、abc* de/-

算法思想:运算符进入堆栈后,后面的运算符在优先级高于或等于堆栈顶层运算符时进入堆栈,相反堆栈顶层运算符进入堆栈直到堆栈顶层运算符的优先级高于后面的运算符,直接输出非运算符

代码实现:这里提供的是一个函数,可以放在Demo类中用main函数进行测试

//骑马订后缀publicstringtopostfix (stringstr ) throws exception (if ) str!=nullstr!=' ' ) { LinkStack lsta=new LinkStack (); String postfix=' '; for(intI=0; istr.length (; I ) charc=str.charat(I; if(c!=' ' ) {if(isleftbracket(c ) ) lsta.push(c ) c; elseif(isrightbracket(c ) ) { while (! isleftbracket(c ) ) postfix=postfix.concat ) lsta.pop (' ' ); 使用//pop方法。 堆叠左括号c=(character ) lsta.pop ); } else if (is操作器(c ) ) { while (! lsta.isempty(prior ) c )=prior ) (character ) lsta.peek ) ) postfix=postfix.concat (lsta.pop ) ')。 (lsta.push ) c; }elsepostfix=postfix.concat(c ' ); } } while (! lsta.isEmpty () ) postfix=postfix.concat ) lsta.pop (' ' ); 返回postfix; } throw new Exception ('骑马订表达式不能为空!' ); (/)运算符publicbooleanisoperator ) charc ) if (c==' '|| c='-'|| c=' * '|| c='/c='/|返回假; //左括号publicbooleanisleftbracket (charc ) ({ return c==' ) ); (//右括号publicbooleanisrightbracket (charc ) ) { return c==' ) '; publicintprior(charc ) if ) c==''|c=='-' )返回1; ELSEif(c=='*'|c=='/'|c=='% ' )返回2; ELSEif(c=='^ ' ) return 3; else return 0; //后缀表达式publicdoublerunpostfix (string postfix ) throwsexception (链接堆栈lsta=new链接堆栈); 双精度=0.0; for(intI=0; ipostfix.length (; I ) charc=postfix.charat(I; if (is操作器(c ) ) try ) double num2=double.parse double (lsta.pop ) (''); 双精度编号1=双精度. parse双精度(lsta.pop () '); if(c==' ' ) {res=num1 num2; }elseif(c=='-' ) {res=num1-num2; }elseif(c=='* ' ) {res=num1*num2; }elseif(c=='/' ) {res=num1/num2; }elseif(c=='% ' ) {res=num1%num2; }elseif(c=='^ ' ) RES=math.pow ) num2,num2); (lsta.push(RES; }catch(exceptionex ) {throw new Exception )后缀表达式无效! ' ); }elselsta.push(c; } RES=double.parse double (lsta.pop (' ' ); 返回RES; }如果有什么错误的地方,欢迎大家的批评指正

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。