使用栈来解决”迷你语法分析器“的问题

Posted &小小白&

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用栈来解决”迷你语法分析器“的问题相关的知识,希望对你有一定的参考价值。

十三、 迷你语法分析器(20220415)

13.1、题设要求

  给定一个字符串 s 表示一个整数嵌套列表,实现一个解析它的语法分析器并返回解析的结果 NestedInteger 。

  列表中的每个元素只可能是整数或整数嵌套列表

示例 1:
输入:s = "324",
输出:324
解释:你应该返回一个 NestedInteger 对象,其中只包含整数值 324。

示例 2:
输入:s = "[123,[456,[789]]]",
输出:[123,[456,[789]]]
解释:返回一个 NestedInteger 对象包含一个有两个元素的嵌套列表:
1. 一个 integer 包含值 123
2. 一个包含两个元素的嵌套列表:
  i.  一个 integer 包含值 456
  ii. 一个包含一个元素的嵌套列表
       a. 一个 integer 包含值 789

提示:
1 <= s.length <= 5 * 104
s 由数字、方括号 "[]"、负号 '-' 、逗号 ','组成
用例保证 s 是可解析的 NestedInteger
输入中的所有值的范围是 [-106, 106]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/mini-parser

13.2、解题思路

  从左至右遍历s,如果遇到 “[” ,则表示是一个新的NestedInteger实例,需要将其入栈.如果遇到 “]” 或 “,” ,则表示是一个数字或者NestedInteger实例的结束,需要将其添加入栈顶的NestedInteger实例。最后返回栈顶的实例即可。

13.3、算法

/**
 * // 这是允许创建嵌列表的接口
 * // 你不应该实现它,也不应该猜测它的实现
 * public interface NestedInteger 
 *     // 构造函数初始化一个空的嵌套列表
 *     public NestedInteger();
 *
 *     // 构造函数初始化单个整数
 *     public NestedInteger(int value);
 *
 *     // 如果此NestedInteger包含单个整数,而不是嵌套列表,则返回True
 *     public boolean isInteger();
 *
 *     // 如果NestedInteger包含单个整数,则返回此NestedInteger保存的单个整数
 *     // 如果此NestedInteger包含嵌套列表,则返回NULL
 *     public Integer getInteger();
 *
 *     // 将此NestedInteger设置为包含单个整数
 *     public void setInteger(int value);
 *
 *     // 设置此NestedInteger以保存嵌套列表并向其添加嵌套整数
 *     public void add(NestedInteger ni);
 *
 *     // 如果NestedInteger包含嵌套列表,则返回此NestedInteger保存的嵌套列表
 *     // 如果此NestedInteger包含单个整数,则返回空列表
 *     public List<NestedInteger> getList();
 * 
 */

//parseInt()函数:用于解析一个字符串,并返回一个整数
//isDigit()函数:检查参数是否为十进制数字字符

class Solution 
    //从左至右遍历s,如果遇到"[",则表示是一个新的NestedInteger实例,需要将其入栈.
    //如果遇到"]"或",",则表示是一个数字或者NestedInteger实例的结束,需要将其添加入栈顶的NestedInteger实例.
    //最后返回栈顶的实例即可.
    public NestedInteger deserialize(String s) 
        //没有"[",就一个整数,结束
        if(s.charAt(0) != '[')
            return new NestedInteger(Integer.parseInt(s));
        
        //定义一个栈来存放数据
        Deque<NestedInteger> stack = new ArrayDeque<>();
        int num = 0;
        boolean negative = false;
        for (int i = 0; i < s.length(); i++) 
            //将字符串中的字符一一取出
            char c = s.charAt(i);
            //字符为'-',输出true
            if (c == '-') 
                negative = true;
            else if (Character.isDigit(c))
                //如果字符为数字,压入栈中
                num = num * 10 + c - '0';
            else if (c == '[')
                //如果字符为'[',压入栈中
                stack.push(new NestedInteger());
            else if (c == ',' || c == ']')
                //如果遇到']'或',',将数字或者NestedInteger实例添加入栈顶的NestedInteger实例
                if (Character.isDigit(s.charAt(i-1)))
                    if (negative)
                        num *= -1;
                    
                    stack.peek().add(new NestedInteger(num));
                
                num = 0;
                negative = false;
                if (c == ']' && stack.size() > 1)
                    NestedInteger ni = stack.pop();
                    stack.peek().add(ni);
                
            
        
        return stack.pop();
    

以上是关于使用栈来解决”迷你语法分析器“的问题的主要内容,如果未能解决你的问题,请参考以下文章

算法题06-用栈来解决汉诺塔问题

Python中,如何使得图像的中文和负号正常显示

输入类型数字,不允许负号或小数?

python--Matplotlib中显示负号问题

win10 永久解决matplotlib 画图中文及负号显示为方框 python

Java编程用栈来求解汉诺塔问题的代码实例(非递归)_java - JAVA