用不同的思路实现括号匹配(java)

文章介绍了如何判断一个包含括号的字符串是否有效,提出了三种不同的方法:1)利用替换思想,通过迭代替换所有成对的括号直到字符串变空;2)使用栈的数据结构,遇到左括号入栈,遇到右括号时与栈顶元素比较并出栈;3)简化版的栈思路,通过计数左括号和右括号的数量差来判断有效性。
摘要由CSDN通过智能技术生成

给定一个只包括 '(',')' 的字符串,判断字符串是否有效。 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
以上就是题目要求

利用替换的思想

()()()()()()()(())

例如需要判断例子中的括号是否有效,用替换的思想具体就是

  • 将字符串中所有的()替换为"";
  • 这样一轮下来之后成对的()就会消失
  • 如例子中就会只剩下
    在这里插入图片描述
  • 然后进行第二轮的时候就会又替换掉
  • 这样所有的()都会消失掉
  • 最后判断字符串的长度是不是0
  • 如果是0则表明这串字符中的括号有效
  • 那如果不满足条件怎么办
()((()((()))))

在这里插入图片描述

  • 首先红框标注的部分就会消失(被""替换)
  • 现在就剩下(((())))
  • 一轮又一轮之后就剩下),
  • 这里的判断条件就是新的字符串不为0
  • 并且新的长度要比旧的长度小

【具体代码】

public class Test2_2 {
    public static void main(String[] args) {
        System.out.println(isEffective("))))))"));
    }

    public  static boolean isEffective(String str){
        int oldLength = str.length();
        if(oldLength % 2 == 0){
            return false;
        }
        String newStr = str.replace("()","");
        int newLength = str.length();
        while (newLength != oldLength && newLength != 0){
            newLength = oldLength;
            newStr = newStr.replace("()","");
            newLength = newStr.length();
        }
        return newLength == 0;
    }
}

利用栈的思想

  • 遇见左括号的时候入栈
  • 遇见右括号的时候和栈顶的元素进行比较
  • 如果相同则栈中的元素出栈
  • 如果不相同则返回错误在这里插入图片描述
import java.util.Scanner;

/**
 * 利用栈进行操作
 */
public class Test2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        System.out.println(judge(str));
    }

    /**
     * 定义一个方法来判断是否括号匹配
     * @param str
     * @return
     */
    public static boolean judge(String str){
        Astack st = new Astack(str.length()/2);
        int i = 0;
        char e;
        boolean flag = false;
        while(i < str.length()){
            e = str.charAt(i);
            if(e=='('){
                st.push(e);
            }
            else {
                if(e == ')'){
                    if(st.isEmpty()){
                        flag = false;
                        break;
                    }
                    if(st.peek() != '('){
                        flag = false;
                        break;
                    }
                    st.pop();
                }
            }
            if(st.isEmpty()){
                flag = true;
            }
            i++;
        }
        return flag;
    }

    /**
     * 用数组模拟一个栈的类
     */
    public static class Astack{
        private int top = -1;
        private int maxsize;
        private char []stack;

        /**
         * 用数组定义一个栈,大小为maxsize;
         * @param maxsize
         */
        public Astack(int maxsize){
            this.maxsize = maxsize;
            stack = new char[maxsize];
        }
        /**
         * 判断栈满
         */
        public boolean isFull(){
            return top == maxsize - 1;
        }
        /**
         * 判断栈空
         */
        public boolean isEmpty(){
            return top == -1;
        }
        /**
         * 入栈
         */
        public void push(char s){
            if(!isFull()){
                top++;
                stack[top] = s;
            }
        }
        /**
         * 出栈
         */
        public char pop(){
            if(isEmpty()){
                throw new RuntimeException("栈满");
            }
            char data = stack[top];
            top -- ;
            return data;
        }
        public char peek(){
            if(isEmpty()){
                throw new RuntimeException();
            }
            return stack[top];
        }
    }
}

【注意】可以用数组模拟一个栈(虽然java中有栈),模拟站的进栈,出栈,取栈顶,判断栈是不是为空,判断栈满等等

栈的简化版

明显可以看出上面的代码比较麻烦,那么可以用栈的思想而不用栈来实现这个题的代码

  • 先定义一个left
  • 从左向右遍历数组
  • 如果出现(则left++,出现则left- -
  • 最后看left是不是0

【代码实现】

public class test4 {
    public static void main(String[] args) {
        System.out.println(isEffective("()"));
    }
    public static boolean isEffective(String str){
        int left = 0;
        for (int i = 0; i < str.length(); i++) {
            char e = str.charAt(i);
            if(e == '('){
                left ++;
            }
            else {
                if(left == 0){
                    return false;
                }
                left --;
            }
        }
        return left == 0;
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值