使用栈来实现字符串符号平衡的检测

4 篇文章 0 订阅
1 篇文章 0 订阅

什么是联机算法?

联机算法是在任意时刻算法对要操作的数据只读入(扫描)一次,一旦被读入并处理,它就不需要在被记忆了。而在此处理过程中算法能对它已经读入的数据立即给出相应子序列问题的正确答案。
该算法仅需要常量空间并以线性时间运行,因此联机算法几乎是完美的算法。

优点

  • 占用空间少,所用时间少

缺点

  • 不宜设计,正确性不易观察,同时附加保留信息较少

什么是平衡符号?

所谓平衡符号就是说,每一个右花括号、右方括号、右大括号等符号,必然要对应一个相应的左花括号、左方括号以及左大括号。

例如:

  • 1.序列:{[()]} 是合法的。
  • 2.序列:{[()]}} 则是非法的,因为它的符号不平衡。

下面是相应的代码实现

import java.util.*;


public class EquilibriumSymbolCheck {

    /**
     * 使用联机算法实现符号平衡的校验
     *
     * 基本思路:
     *  将字符串转成字符数组顺序读取,如果字符是一个开放符号则将该开放符号压栈。如果读到的符号是一个闭合符号,
     *  此时弹栈,将该闭合符号与栈中探出的元素进行比较。如果比较结果是二者相同,则继续读取。如果比较结果是二者
     *  不相等,此时直接返回false。
     *
     * @param string 被校验的字符串
     * @param map 校验规则map。格式为 map(开放符号,闭合符号),开放符号和闭合符号可以设置多个(必须成对出现)。
     * @return
     */
    public static Boolean validString(String string,Map map) {
        Stack<Character> stack = new Stack<>();

        char[] chars = string.toCharArray();
        //标志位,用于判断该对栈进行何种操作
        int flag = 0;
        for (int i = 0; i < chars.length; i++) {
            //用于校验类似双引号"和单引号'这种开放符号和闭合符号相等的情况
            if (map.containsValue(chars[i]) && map.containsKey(chars[i])) {
                if (flag == 0) {
                    stack.push(chars[i]);
                    flag++;
                    continue;
                } else {
                    if (!stack.pop().equals(map.get((Character) chars[i]))) {
                        return false;
                    } else {
                        flag--;
                        continue;
                    }
                }
            }
            //将开放符号压栈
            if (map.containsKey(chars[i])) {
                stack.push(chars[i]);
                continue;
            }
            //将开放符号弹栈,并进行比较
            if (map.containsValue(chars[i])) {
                if (stack.empty())
                    return false;
                if (!map.get(stack.pop()).equals(chars[i]))
                    return false;
            }
        }
        if (!stack.empty()) {
            return false;
        }
        return true;
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值