寒假冬令营(算法编程)1月10日(栈)

题目描述(1)

P1427 小鱼的数字游戏

小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 $a_i$(长度不一定,以 $0$ 结束),记住了然后反着念出来(表示结束的数字 $0$ 就不要念出来了)。这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问题。

输入格式

一行内输入一串整数,以0结束,以空格间隔。

输出格式

一行内倒着输出这一串整数,以空格间隔。

样例 

样例输入 

3 65 23 5 34 1 30 0

样例输出

30 1 34 5 23 65 3

提示

数据规模与约定

解题结果

Java

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
​
        Stack<Integer> stack = new Stack<>();
​
        // 读取输入数字并压入栈,直到输入为 0
        int num;
        while ((num = scanner.nextInt()) != 0) {
            stack.push(num);
        }
​
        // 依次弹出栈中的数字并输出
        while (!stack.isEmpty()) {
            System.out.print(stack.pop() + " ");
        }
    }
}

题目描述(2)

P1739 表达式括号匹配

假设一个表达式有英文字母(小写)、运算符(+-*/)和左右小(圆)括号构成,以 @ 作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出 YES;否则输出 NO。表达式长度小于 255255,左圆括号少于 2020 个。

输入格式

一行:表达式。

输出格式

一行:YESNO

输入输出样例

输入

2*(x+y)/(1-x)

输出 

YES

输入 

(25+x)*(a*(a+b+b)

输出

NO

说明/提示

表达式长度小于 255255,左圆括号少于 2020 个。

解题结果

Java

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String expression = scanner.nextLine() + "@"; // 添加结束符
​
        if (checkParentheses(expression)) {
            System.out.println("YES");
        } else {
            System.out.println("NO");
        }
    }
​
    private static boolean checkParentheses(String expression) {
        Stack<Character> stack = new Stack<>();
​
        for (char c : expression.toCharArray()) {
            if (c == '(') {
                stack.push(c);
            } else if (c == ')') {
                if (stack.isEmpty() || stack.pop() != '(') {
                    return false;
                }
            }
        }
​
        return stack.isEmpty();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Pedestrians74

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

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

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

打赏作者

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

抵扣说明:

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

余额充值