栈:P1149后缀表达式解析(java)

题目描述
在这里插入图片描述
一道标准的模拟栈的题目,java中的stack、linkedlist都可以被使用,附上我的代码

答案

import java.util.Scanner;
import java.util.Stack;

/**
 * @author :Zeeland
 * @date :Created in 2021/3/10 17:38
 * @version: 1.0$
 */

public class P1449 {
    public static void main(String[] args) {
        Scanner s =new Scanner(System.in);
        while(s.hasNext()){
            String str =s.next();//接受数据
            char []arr =str.toCharArray();//转换为字符数组
            Stack<String> stack =new Stack<>();
            int mid;
            String k ="";
            //遍历字符数组,对里面的成分进行判断
            for (int i = 0; i < arr.length; i++) {
                switch (arr[i]){
                    //如果是'.',则把前面的数字入栈
                    case '.':
                        if(i > 0) stack.add(k);
                        k ="";
                        break;
                    case '-':
                        mid =-Integer.parseInt(stack.pop())+Integer.parseInt(stack.pop());
                        //String转换为int
                        stack.add(mid+"");
                        break;
                    case '+':
                        mid =Integer.parseInt(stack.pop())+Integer.parseInt(stack.pop());
                        //String转换为int
                        stack.add(mid+"");
                        break;
                    case '*':
                        mid =Integer.parseInt(stack.pop())*Integer.parseInt(stack.pop());
                        //String转换为int
                        stack.add(mid+"");
                        break;
                    case '/':
                        int a = Integer.parseInt(stack.pop());
                        int b = Integer.parseInt(stack.pop());
                        mid = b /a;
                        //String转换为int
                        stack.add(mid+"");
                        break;
                    //结束判断
                    case '@':
                        break;
                    //如果不是符号的话就说明这个元素是数字,如果是数字则将这些数字拼接起来成为一个数字字符
                    default://数字
                        k += String.valueOf(arr[i]);
                }
            }
			//输出结果            
            System.out.println(stack.peek());

        }
    }
}

这里的思路是把这串字符串转换为数组进行分析判断,如果碰到’.'的话就将前面的数字入栈,如果碰到符号就进行运算,这是常规的思路,但是在实际coding的时候容易出问题。

比如,我之前的思路是这样子的:arr为字符数组,遍历arr,如果arr[i]==’.’,那么我将arr[i-1]入栈,这样子做实际上没有考虑到入栈的数字是多位数的情况,如果是多位数,你入栈一个数字就会产生错误,运行错误且产生错误的答案,所以细节十分重要。题目给的实例只有个位数,以后在arr是字符数组的时候需要考虑它的位数构成,这在模拟栈的题目中显得极为重要!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 下面是一个Java代码实现后缀表达式的求值过程: ```java import java.util.*; public class PostfixExpression { public static void main(String[] args) { String expression = "2 3 * 4 +"; System.out.println("结果是: " + evaluatePostFixExpression(expression)); } public static int evaluatePostFixExpression(String expression) { Stack<Integer> stack = new Stack<>(); String[] tokens = expression.split(" "); for (String token : tokens) { if (isOperator(token)) { int operand2 = stack.pop(); int operand1 = stack.pop(); int result = applyOperator(token, operand1, operand2); stack.push(result); } else { int operand = Integer.parseInt(token); stack.push(operand); } } return stack.pop(); } public static boolean isOperator(String token) { return token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/"); } public static int applyOperator(String operator, int operand1, int operand2) { int result = 0; switch (operator) { case "+": result = operand1 + operand2; break; case "-": result = operand1 - operand2; break; case "*": result = operand1 * operand2; break; case "/": result = operand1 / operand2; break; default: break; } return result; } } ``` 该程序解析给定的后缀表达式,并分别将数字和运算符推送到堆中。对于每个运算符,程序弹出两个操作数并将结果推回堆,直到表达式的末尾。最后,程序返回的最后一个元素,它应该是表达式的结果。 ### 回答2: 后缀表达式,也称为逆波兰表达式,是一种将运算符后置的算术表达式表示方法。求解后缀表达式的过程可以通过利用来实现。 下面是一个简单的Java代码示例,用于求解后缀表达式的值: import java.util.Stack; public class PostfixExpressionEvaluation { public static double evaluatePostfixExpression(String postfixExpression) { Stack<Double> stack = new Stack<>(); for (int i = 0; i < postfixExpression.length(); i++) { char c = postfixExpression.charAt(i); if (Character.isDigit(c)) { stack.push(Double.parseDouble(Character.toString(c))); } else { double operand2 = stack.pop(); double operand1 = stack.pop(); double result = 0; switch (c) { case '+': result = operand1 + operand2; break; case '-': result = operand1 - operand2; break; case '*': result = operand1 * operand2; break; case '/': result = operand1 / operand2; break; case '^': result = Math.pow(operand1, operand2); break; } stack.push(result); } } return stack.pop(); } public static void main(String[] args) { String postfixExpression = "52+83-*"; double result = evaluatePostfixExpression(postfixExpression); System.out.println("后缀表达式的求值结果为:" + result); } } 在上述代码中,我们通过利用一个来存储运算符操作数的结果。遍历后缀表达式中的每个字符,如果是数字,则将其转换成Double类型并入;如果是运算符,则从中弹出两个操作数进行相应的运算,然后将结果入。最后中的唯一元素即为后缀表达式的求值结果。 例如,给定后缀表达式"52+83-*",按照上述代码执行,我们可以得到该表达式的值为9.0。 ### 回答3: 后缀表达式也称为逆波兰表达式,是一种将运算符置于操作数之后的表示方法。求解后缀表达式的过程可以使用堆(Stack)来实现。 算法代码如下: ```java import java.util.Stack; public class EvaluatePostfixExpression { public static int evaluate(String postfixExpression) { Stack<Integer> stack = new Stack<>(); // 遍历后缀表达式中的每个字符 for (int i = 0; i < postfixExpression.length(); i++) { char c = postfixExpression.charAt(i); // 如果是数字,则将其转换成整数并压入中 if (Character.isDigit(c)) { stack.push(Character.getNumericValue(c)); } else { // 如果是操作符,则取出顶的两个数字进行计算,并将结果压入中 int num2 = stack.pop(); int num1 = stack.pop(); switch (c) { case '+': stack.push(num1 + num2); break; case '-': stack.push(num1 - num2); break; case '*': stack.push(num1 * num2); break; case '/': stack.push(num1 / num2); break; } } } return stack.pop(); } public static void main(String[] args) { String postfixExpression = "34+52-*"; int result = evaluate(postfixExpression); System.out.println("后缀表达式的求值结果为:" + result); } } ``` 上述代码中,我们创建了一个整型的堆。遍历后缀表达式的每个字符,如果是数字则将其转换成整数并压入中;如果是操作符,则取出顶的两个数字进行相应的计算,并将结果压入中。最后,返回顶元素的值即为后缀表达式的求值结果。 在上面的示例中,后缀表达式为"34+52-*",根据求值过程,先遇到数字3和4,将其分别压入中;遇到+操作符,取出顶的两个数字4和3,执行加法并将结果7压入中;接着遇到数字5和2,将其分别压入中;最后遇到-操作符,取出顶的两个数字2和5,执行减法并将结果-3压入中。最终,中只剩下一个元素-3,即为后缀表达式的求值结果。 希望上述代码对您有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zeeland

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值