洛谷-P1449 后缀表达式(java,栈)

题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。

如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。

输入格式

输入:后缀表达式
输出格式

输出:表达式的值

输入输出样例
输入 #1
3.5.2.-*7.+@

输出 #1
16

刚好看过这个算法的视频,底气就是不一样, 两次过

思路:

开辟一个栈,用来存放数据,遇到符号则取出来(注意取的顺序谁先谁后)。
如果都是一位数的话,那就很简单了,可是有的不止一位数,所以我们就得考虑,怎么样才能把多位数从字符串里面取出来压栈。

提示:
Integer.parseInt()–》字符串变整数。
str.substring(Start,end);–》截取字符串中 [Start,end)的字符,!左闭右开!


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

public class Main {
    public static void main(String[] args) {
        Stack<Integer> shu = new Stack<>();
        //存放数字的栈
        Scanner input = new Scanner(System.in);
        String str = input.next();
        int num1 = 0, num2 = 0,num = 0,k=0,flag=0;
        for (int i = 0; i<str.length();i++){
            if (str.charAt(i)=='@'){
                break;
            }else if ('0' <=str.charAt(i) && str.charAt(i) <= '9'||str.charAt(i)=='.'){
            //判断是否为数字或者为断点
                if (flag == 0){
                //遇到第一个数字,则记住他的下标,并把flag设1,让k不动。
                    k = i;
                    flag = 1;
                    continue;
                }else if (str.charAt(i) == '.'){
                //遇到断点的话,则把k到当前i-1的数字字符取出来。压栈,并把k和flag置0,以便下个数字的截取。
                    num = Integer.parseInt(str.substring(k,i));
                    shu.push(num);
                    k = 0;
                    flag = 0;
                    continue;
                }

            
            }else{
            //出栈,出栈顺序要注意谁先谁后
                num2 = shu.pop();
                num1 = shu.pop();
                switch (str.charAt(i)){
                    case '+':
                        num = num1+num2;
                        break;
                    case '-':
                        num = num1 - num2;
                        break;
                    case '*':
                        num = num1*num2;
                        break;
                    case '/':
                        num = num1 / num2;
                        break;

                }
                // 把计算后的数压栈
                shu.push(num);
            }

        }
        //输出栈内最后的一个数,该数就是该后缀表达式的结果
        System.out.println(shu.pop());
        input.close();
    }
}

题目链接:https://www.luogu.com.cn/problem/P1449

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

北海南风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值