首页 > 编程知识 正文

简述计算后缀表达式的值的过程,后缀表达式计算结果

时间:2023-05-05 02:50:46 阅读:44317 作者:4876

1 .骑马订后缀公式在计算常规四则运算时,如1(2)3*4-5) 6该公式为骑马订公式,但对计算机来说,采用骑马订公式计算并不友好。 因此,有必要将骑马订式转换为对计算机来说更容易计算的后缀式。

转换方法:建立1.堆栈s1和列表s2。 从左到右依次遍历2.骑马订格式。 (以下,将遍历的字符称为s )3.堆栈s1为空时,直接将s推入堆栈。 如果4.s是数字,则将该数字添加到列表s2中; s为“)”时,将s推入堆栈s1。5.s为运算符时,s1堆栈顶部为“()”时,将s直接推入堆栈; 相反,必须确定此运算符和s1堆栈顶部运算符的优先级。 如果优先级大于堆栈顶运算符,则必须直接将s推入堆栈中;如果优先级小于或等于堆栈顶运算符,则必须弹出堆栈顶运算符将其添加到s2列表中。 如果6.步骤5结束,但s的优先级小于或等于堆栈顶运算符的优先级,请重复步骤5。 如果7.s为“”,则依次弹出s1堆栈顶部元素并将其存储在列表s2中,直到s1堆栈顶部元素为“”。 然后,堆栈顶部的「()”也将弹出。8.遍历结束后,依次弹出s1堆栈中的元素,将其添加到s2列表中。 最后依次输出s2列表可以得到后缀表达式。

代码实现://自变量zhong是骑马订列表publicstaticliststringzhongtohou (liststringzhong )//堆栈s1和列表S2堆栈字符串s1新堆栈); ListString s2=new ArrayList (; 字符串s; for(intI=0; I中. size (; (s=Zhong.get ) I; //数字时直接堆栈,将索引I向后移动if (s.matches ) (d ) (S2.add ) s ); I; }elseif(s.equals (' ) ) /为左括号时直接堆栈,将索引I向后移动s1.push(s ) s; I; }elseif(s.equals (' ) ) /为右括号时,堆栈顶部为右括号while (! s1.peek ().equals (' ) ) ) S2.add (S1.pop ) ); (//堆栈顶部的左括号为s1.pop ); //将索引向后移动I; } else { //如果堆栈为空,或者堆栈顶为“(”,或者运算符的优先级大于堆栈顶运算符的优先级,则直接堆栈并将索引向后移动。 (这里是priorty ) )确定优先级的方法很容易自己创建(if ) S1.empty )|| s1.peek ).equals (' ) priorty ) s.charat) ) priorty I; }如果小于或等于} else { //堆栈顶部运算符的优先级,则弹出堆栈顶部运算符并将其存储在列表s2中,以便索引此时不移动,从而使该运算符能够继续进行判断。 S2 .添加(S1.pop ) ); }//按顺序弹出堆栈中的其馀元素列表s2 while (! s1.empty () (S2.add ) S1.pop ) ); //最后返回后缀表达式列表s2 return s2; } 2.后缀表达式的计算是开头所示的例子1(23*4-5) 6,该骑马订表达式的后缀表达式为:「1234*5-6”

计算方法:创建空堆栈。 遍历的后缀表达式。 以下,将遍历目标的字符称为s。 如果s是数字,请推入堆栈堆栈。 如果s是运算符,则提取堆栈顶部和第二个堆栈顶部的两个数字,根据运算符s对两个数字进行运算,并将运算结果推入堆栈。 遍历结束后,堆栈上剩下的唯一数字就是运算结果。 代码实现:/** *通过传递后缀表达式列表计算* @ paramlist * @ return */publicstaticstringculculate (liststringlist ) {堆栈字符串堆栈for(strings:list )//s为数字时直接堆栈if ) s.matches ) ) (d ) ) stack.push ) s ); }如果} else { //是运算符,则弹出堆栈顶和子堆栈顶进行运算的String num2=stack.pop (; String num1=stack.pop (; sitch(s ) { case ' : result=integer.parseint (num1) integer.parseint (num2) }; 布雷克; case '-' : result=integer.parseint (num1)-integer.parseint (num2); 布雷克; case ' * ' : result=integer.parseint (num1) integer.parseint (num2); 布雷克; case '/' : result=integer.parseint (num1)/integer.parseint (num2); 布雷克; efault : thrownewruntimeexception (“包含非法字符”); //将运算结果按入堆栈stack.push (string.value of ) result ); (//运算结果return stack.pop ); }

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