猿辅导解压字符串问题

在这里插入图片描述
在这里插入图片描述

我的答案:思路很明显,就是用栈去模拟这个过程。

import java.util.*;

public class Main {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNextLine()){
            int n = scanner.nextInt();
            scanner.nextLine();
            for (int i = 0; i < n; i++) {
                char[] chars = scanner.nextLine().toCharArray();
                Stack<Character> stack = new Stack<>();
                int index = 0;
                StringBuilder result = new StringBuilder();
                while(index < chars.length){
                    //如果是'('或字母直接入栈
                    if(chars[index] == '(' || (chars[index] >= 'A' && chars[index] <= 'Z')) {
                        stack.push(chars[index++]);
                    }
                    //‘)’后面一定是数字
                    //如果是')'则找到后面的连续数字表示多少倍,然后出栈直到遇到'(',将字符多少倍的入栈
                    else if(chars[index] == ')'){
                        index++;
                        //找出后面的数字时多少
                        int num = 0;    //括号后面的数字
                        while (index < chars.length && Character.isDigit(chars[index])){
                            num = num*10 + chars[index] - '0';
                            index++;
                        }
						//找到栈中的'('将字符串乘以num倍
                        ArrayList<Character> tmp = new ArrayList<>();
                        while (!stack.isEmpty() && stack.peek()!='('){
                            tmp.add(stack.pop());
                        }
                        stack.pop();
                        for (int j = 0; j < num; j++) {
                            for (int k = tmp.size()-1; k >= 0; k--) {
                                stack.add(tmp.get(k));
                            }
                        }
                    }

                    //如果是数字且数字前没有括号,将栈顶倍数后入栈
                    else if(Character.isDigit(chars[index])){
                        int num = 0;    //括号后面的数字
                        while (index < chars.length && Character.isDigit(chars[index])){
                            num = num*10 + chars[index] - '0';
                            index++;
                        }
                        char top = stack.pop();
                        for (int j = 0; j < num; j++) {
                            stack.push(top);
                        }
                    }
                }
                //输出结果,从栈底开始输出
                while (!stack.isEmpty()){
                    result.append(stack.pop());
                }
                String string = result.reverse().toString();
                System.out.println(string);
            }
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值