Python 每日一记238>>>Java栈应用之括号匹配问题

一、思路

括号都要是成对出现的,怎么判断括号是否匹配呢,可以使用栈的方法,循环遍历一个含有括号的字符串,如果是左括号就将其压栈,继续遍历,如果是右括号就从栈中取出一个左括号,如果此时取出的是null,表明不匹配了,退出程序,如果弹出的不是null,则表明这次匹配成功,继续循环,直到遍历完字符串,退出循环后,如果栈中还有剩余左括号,说明左括号多了,也表明不匹配,只有当正常结束循环时,栈中没有左括号,表示整个字符串中括号是匹配的。

注意里面的括号都使用中文的哦,要么都使用英文的。

二、代码

package mypackage;

import java.util.Iterator;
//栈类
class Stack<T> implements Iterable<T> {

    //节点类
    private static class Node<T> {
        T data;
        Node next;

        //构造方法
        public Node(T data, Node next) {
            this.data = data;
            this.next = next;
        }
    }
//    成员变量,头节点,节点个数
    Node head;
    int  N;
//    构造方法
    public Stack(){
//        初始head不指向任何节点,元素个数为零
        this.head=new Node(null,null);
        this.N=0;
    }

//    节点个数
    public int size(){
        return N;
    }

    //  是否为空
    public boolean isempty (){
        return N==0;
    }

    //    压栈,即向链表中添加元素,注意因为栈是先进后出,每次添加节点应该都是添加在首节点后,再让新节点指向之前的第一个节点
//    第一次添加元素是让首节点指向新节点,接着再添加节点,就要让首节点指向新节点,新节点指向之前的第一个节点,依次类推
    public void push(T data){
        if (N==0){
            Node newnode=new Node(data,null);
            head.next=newnode;
            N++;
        }
        else {
            Node oldfirst=head.next;
            Node newnode=new Node(data,null);
            head.next=newnode;
            newnode.next=oldfirst;
            N++;
        }
    }

//    出栈
//    如果为空,则弹出null,
//    如果不为空,弹出head后的第一个元素,让head指向第二个元素
    public T pop() {
        Node oldfirst = head.next;
        if (oldfirst==null) {
            return null;
        }
        else {
            head.next = oldfirst.next;
            N--;
            return (T) oldfirst.data;
        }
    }

//    重写,用于遍历
    @Override
    public Iterator<T> iterator() {
        // 返回的Iterator对象,创建一个内部类实现这个接口
        return new SIterator();
    }

    //    创建一个内部类实现Iterator接口
    public class SIterator implements Iterator {
        //        定义一个遍历的节点
        private Node n;
        public SIterator(){
//            初始化为0索引位置
            this.n=head;
        }
        //重写两个方法
        @Override
        public boolean hasNext() {
//            这个方法判断是否超出最大索引,如果超出会停止遍历
            return n.next!=null;
        }

        @Override
        public Object next() {
//            这个方法会遍历得每个节点
            n=n.next;
            return n.data;
        }
    }
}

//测试
public class MyJava {

    public static void main(String[] args) {
//        注意这里的括号是中文下的括号,不是英文下的括号
        String s = "我们的名字是(中华儿女),我们都有责任守护(中国!";
        System.out.println("括号是否匹配:"+ismatch(s));
    }
//    括号匹配判断的方法
    public static boolean ismatch(String str){
        Stack<String> stack = new Stack<>();
        for (int i=0;i<str.length();i++){
//            获取每个字符,+""可转化为字符串类型
            String s1 =str.charAt(i)+"";
//          如果是左括号,就压栈
            //        注意这里的括号是中文下的括号,不是英文下的括号
            if (s1.equals("(")){
                stack.push(s1);

            }
//            如果是右括号,就出栈
            //        注意这里的括号是中文下的括号,不是英文下的括号
            else if (s1.equals(")")){
                String pop=stack.pop();
//                如果出栈的是空,说明栈中已经没有匹配的左括号了
//                说明已经无法匹配,return即退出循环了
                if (pop==null){
                    return false;
                }
            }
        }
//        整个循环完毕后,如果栈内还有剩余的括号,说明左括号过多,也不匹配
        if (stack.size()==0)
            return true;
        else {
            return false;
        }
    }
}

结果:
在这里插入图片描述

发布了235 篇原创文章 · 获赞 24 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_44663675/article/details/105536487