一、思路
括号都要是成对出现的,怎么判断括号是否匹配呢,可以使用栈的方法,循环遍历一个含有括号的字符串,如果是左括号就将其压栈,继续遍历,如果是右括号就从栈中取出一个左括号,如果此时取出的是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;
}
}
}
结果: