(回收站)后缀表达式求值
发布日期:2021-06-30 16:57:19 浏览次数:2 分类:技术文章

本文共 3008 字,大约阅读时间需要 10 分钟。

代码(版本二)

package cn.edut.test_stack;import java.util.Stack;import org.junit.Test;public class Demo02_postfix {
@Test public void test01() {
System.out.println("Test1:后缀求值"); String s = "6 5 2 3 + 8 * + 3 + * 2 /"; //144 System.out.println(postfix_2(s)); } public static int postfix_2(String input){
String[] tempString = input.split("\\s+"); // 空格分开字符串 Stack
stack_Integer = new Stack<>(); //存数字 for(String s : tempString) {
int temp = 0 ; switch(s) {
case "+" : int b1 = stack_Integer.pop() ; int a1 = stack_Integer.pop() ; temp = a1+b1 ; break; case "-" : int b2 = stack_Integer.pop() ; int a2 = stack_Integer.pop() ; temp = a2-b2 ; break; case "*" : int b3 = stack_Integer.pop() ; int a3 = stack_Integer.pop() ; temp = a3*b3 ; break; case "/" : int b4 = stack_Integer.pop() ; int a4 = stack_Integer.pop() ; temp = a4/b4 ; break; default: temp = Integer.parseInt(s); } stack_Integer.push(temp) ; } if(stack_Integer.size()==1) {
//算出一个值 return stack_Integer.pop() ; }else {
//还有几个值没参与运算 throw new IllegalAccessError(); } } }

代码(版本三)

package cn.edut.clac;import java.util.ArrayList;import java.util.List;import java.util.Stack;import org.junit.Test;public class Calculator_Demo {
/** * 分析表达式,返回计算值 * 外部直接调用 * @param s * @return */ //public static int calcExpression(String s) {return } /** * 测试1: * 1字符串录入, * 2后缀求值 */ @Test public void Test01() {
String suffix_expression = "1 2 3 * + 4 5 + 6 * + 7 - 2 /"; //27 //测试:字符串 =》 后缀List System.out.println(parseExpression(suffix_expression).toString()); //测试:后缀List =》求值 System.out.println(doCalc(parseExpression(suffix_expression)));; } /** * 测试2: * 1 中缀 转后缀 * 2 中缀 转后缀 取值 */ @Test public void Test02() {
} /** * 分割字符 * 1 接收一个:由多个空格隔开的字符 * 2 分割这些字符 * 3 返回字符ArrayList * @param str * @return */ private List
parseExpression(String str){
//空格分开字符 String[] strTemp = str.split("\\s+"); //字符存入List List
outList = new ArrayList<>(); for(String s : strTemp) {
outList.add(s) ; } return outList; } /** * 后缀求值: * 1 接收一个List
* 2 遍历、分析是否为数字 * 2.1 数字 - 存入栈 * 2.2 不是数字 - 判断符号,栈中取顶、进行运算 * 3 返回值 */ private int doCalc(List
str) {
//操作的栈 Stack
stackInteger = new Stack<>(); for(String s : str) {
//是数字 if(s.matches("\\d")) {
//数字,字符串转Integer stackInteger.push(Integer.parseInt(s)); }//不是数字 else {
//栈中取值 int num2 = stackInteger.pop(); int num1 = stackInteger.pop(); //运算的结果 int result = 0 ; //判断符号,四则运算 switch(s) {
case "+" : result = num1+num2; break; case "-" : result = num1-num2; break; case "*" : result = num1*num2; break; case "/" : result = num1/num2; break; //整数除 default : throw new RuntimeException("四则运算符号对不上"); } //运算的结果存入stack stackInteger.push(result) ; } } //返回stack的值 return stackInteger.pop(); }}

转载地址:https://lawsssscat.blog.csdn.net/article/details/102981388 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:《数据结构与算法分析-java语言描述》 - 逆波兰计算器 - Calculator(自制)
下一篇:java备忘 - 常用类、JVM、正则表达式、工具、常识/误区

发表评论

最新留言

很好
[***.229.124.182]2024年05月04日 11时29分57秒