java括号匹配算法求解(用栈实现)

 更新时间:2020年12月04日 17:33:17   作者:阿飞Sirx  
这篇文章主要介绍了java括号匹配算法求解(用栈实现),需要的朋友可以参考下

如何使用栈来判定括号是否匹配

对于给定的表达式,可以使用栈来实现括号匹配判定,这个算法在编译器中非常重要,解析器每次读入
一个字符,如果字符是一个开分隔符,如(,【,{,入栈,若读入的是闭分隔符),】,},出栈,如果两者匹配,继续解析字符串,如果不匹配,解析器错误

算法思路

1.创建一个栈
2.当(当前字符不等于输入的结束字符)
(1)如果当前字符不是匹配的字符,判断栈内是否为空,如果栈为空,括号必然不完整
(2)如果字符是一个开分隔符,那么将其入栈
(3)如果字符是一个闭分隔符,,且栈不为空,则判断是否匹配
(4)栈结束后判断是否为空,不为空则括号匹配错误

代码示例

class Solution {
  public boolean isValid(String s) {
    //声明匹配词典
    Map<Character, Character> map = new HashMap<>();
    map.put(')', '(');
    map.put(']', '[');
    map.put('}', '{');
    //创建栈
    Stack<Character> stack = new Stack<>();
    for (char ch : s.toCharArray()) {
      //开分隔符入栈
      if (ch == '(' || ch == '[' || ch == '{') {
        stack.push(ch);
      }
      //出栈并且栈非空进行匹配
      else if (stack.isEmpty() || stack.pop() != map.get(ch)){
        return false;
      }
    }
    //如果栈非空则括号匹配错误
    return stack.isEmpty();
  }
}



下面是其他同学的补充

1.括号匹配算法

//括号匹配算法
    public void pipei()throws Exception{
      char temp,ch;
      int match;  //记录匹配结果
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      ch=(char) br.read();    //输入一个字符
      while(ch!='0'){
        if(getTop()==-1){
          push(ch);
        }else{
          temp=pop();    //取出栈顶元素
          match=0;  //判断是否匹配(默认不匹配)
          if(temp=='('&&ch==')')
            match=1;
          if(temp=='['&&ch==']')
            match=1;
          if(temp=='{'&&ch=='}')
            match=1;
          if(temp=='<'&&ch=='>')
            match=1;
          if(match==0){  //如果不匹配
            push(temp);  //将原栈顶元素重新入栈
            push(ch);  //将输入的括号字符入栈
          }
        }
        ch=(char) br.read();  //输入下一个字符
      }
      if(isEmpty()){
        System.out.println("输入的括号完全匹配!");
      }else{
        System.out.println("输入的括号不匹配,请检查!");
      }
    }

2.括号匹配求解示例

package com.cn.datastruct;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;

public class KuoHaoPiPei {
  static class Stack{
    char[] data; //存放数据
    int MaxSize;  //最大容量
    int top;    //栈顶指针
    //构造方法
    public Stack(int MaxSize){
      this.MaxSize=MaxSize;
      data = new char[MaxSize];
      top = -1;
    }

    public int getMaxSize() {
      return MaxSize;
    }

    public int getTop() {
      return top;
    }

    public boolean isEmpty(){
      return top==-1;
    }
    
    public boolean isFull(){
      return top+1==MaxSize;
    }
    //入栈
    public boolean push(char data){
      if(isFull()){
        System.out.println("栈已满!");
        return false;
      }
      this.data[++top]=data;
      return true;
    }
    //出栈
    public char pop() throws Exception{
      if(isEmpty()){
        throw new Exception("栈已空!");
      }
      return this.data[top--];
    }    
    //获得栈顶元素
    public char peek(){
      return this.data[getTop()];
    }
    
    //括号匹配算法
    public void pipei()throws Exception{
      char temp,ch;
      int match;  //记录匹配结果
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      ch=(char) br.read();    //输入一个字符
      while(ch!='0'){
        if(getTop()==-1){
          push(ch);
        }else{
          temp=pop();    //取出栈顶元素
          match=0;  //判断是否匹配(默认不匹配)
          if(temp=='('&&ch==')')
            match=1;
          if(temp=='['&&ch==']')
            match=1;
          if(temp=='{'&&ch=='}')
            match=1;
          if(temp=='<'&&ch=='>')
            match=1;
          if(match==0){  //如果不匹配
            push(temp);  //将原栈顶元素重新入栈
            push(ch);  //将输入的括号字符入栈
          }
        }
        ch=(char) br.read();  //输入下一个字符
      }
      if(isEmpty()){
        System.out.println("输入的括号完全匹配!");
      }else{
        System.out.println("输入的括号不匹配,请检查!");
      }
    }
  }
  
  public static void main(String[] args) throws Exception {
    String go;
    Scanner input = new Scanner(System.in);
    Stack stack = new Stack(20);
    System.out.println("括号匹配问题!");
    do{
      System.out.println("请输入一组括号的组合,以0表示结束。支持的括号包括:{},(),[],<>。");
      stack.pipei();    //匹配算法
      System.out.print("\n继续匹配吗(y/n)?");
      go=input.next();
    }while(go.equalsIgnoreCase("y"));
    System.out.println("匹配结束!");
  }

}

程序运行结果如下:

括号匹配问题!
请输入一组括号的组合,以0表示结束。支持的括号包括:{},(),[],<>。
({[]})<>0
输入的括号完全匹配!

继续匹配吗(y/n)?y
请输入一组括号的组合,以0表示结束。支持的括号包括:{},(),[],<>。
({])0
输入的括号不匹配,请检查!

继续匹配吗(y/n)?n
匹配结束!

补充2

#include <cstdio>
#include <iostream>
using namespace std;
 
#define MAXSIZE 20
 
typedef struct {
	char *base;
	char *top;
	int stacksize;
}SqStack;
 
void InitStack(SqStack &S)
{
	S.base = (char *)malloc( MAXSIZE * sizeof(char) );
	if(S.base == NULL)	exit(-2);
	S.top = S.base;
	S.stacksize = MAXSIZE;
}
 
void GetTop(SqStack S, char &e)
{
	if(S.top == S.base)
		return;
	e = *(S.top - 1);
}
 
void Push(SqStack &S, char e)							//	不考虑栈满
{
	*S.top++ = e;
}
 
void Pop(SqStack &S, char &e)
{
	if(S.top == S.base)
		return;
	S.top--;
	e = *S.top;
}
 
bool Match(char c, SqStack &my_stack, bool &tag)
{
	char e;
	Pop(my_stack, e);
	if ( c != e ) {
		tag = false;
		free(my_stack.base);
		return false;									//	match fail
	}
	return true;										//	match success
}
 
void Correct(char *expr, bool &tag)
{
	tag = true;	
	SqStack my_stack;
	InitStack (my_stack);
	for( int i = 0; expr[i] != '\0'; i++ ) {
		char c = expr[i];
		switch(c) {
			
		case '{' : case '[' : case '(' :
			Push (my_stack, c); break;
			
		case '}' : 
			if( Match('{', my_stack, tag) == false )	//	match fail
				return;
			break;
			
		case ']' : 
			if( Match('[', my_stack, tag) == false )	//	match fail
				return;
			break;
			
		case ')' : 
			if( Match('(', my_stack, tag) == false )	//	match fail
				return;
			break;
			
		default :
			break;										//	其它字符
		}
	}
	if(my_stack.top != my_stack.base)					// e.g.: "[r"
		tag = false;
	free(my_stack.base);
}
 
int main(void)
{
	//	freopen("cin.txt", "r", stdin);
	char my_expr[MAXSIZE];
	while(cin >> my_expr) {
		bool tag = true;
		Correct( my_expr, tag);
		tag ? printf("匹配成功\n") : printf("匹配失败\n");
	}
	
	return 0;
}

到此这篇关于java括号匹配算法求解(用栈实现)的文章就介绍到这了,更多相关java括号匹配算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java多线程中的原子类属性说明

    Java多线程中的原子类属性说明

    这篇文章主要介绍了Java多线程中的原子类属性说明,对多线程访问同一个变量,我们需要加锁,而锁是比较消耗性能的,JDk1.5之后,新增的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式,需要的朋友可以参考下
    2023-10-10
  • 使用Java实现三种等级的扫雷游戏(完整版)

    使用Java实现三种等级的扫雷游戏(完整版)

    扫雷是一款大众类的益智小游戏,根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输,下面这篇文章主要给大家介绍了关于使用Java实现三种等级的扫雷游戏的相关资料,需要的朋友可以参考下
    2023-01-01
  • Java调用pyzbar解析base64二维码过程解析

    Java调用pyzbar解析base64二维码过程解析

    这篇文章主要介绍了Java调用pyzbar解析base64二维码过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Spring组件开发模式支持SPEL表达式

    Spring组件开发模式支持SPEL表达式

    今天小编就为大家分享一篇关于Spring组件开发模式支持SPEL表达式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • SpringBoot JPA懒加载失效的解决方案(亲测有效)

    SpringBoot JPA懒加载失效的解决方案(亲测有效)

    这篇文章主要介绍了SpringBoot JPA懒加载失效的解决方案(亲测有效),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • IntelliJ IDEA报错Error:java: Compilation failed: internal java compiler error的解决办法

    IntelliJ IDEA报错Error:java: Compilation failed: internal java

    今天小编就为大家分享一篇关于IntelliJ IDEA报错Error:java: Compilation failed: internal java compiler error的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • java中transient关键字分析

    java中transient关键字分析

    这篇文章主要介绍了java中transient关键字分析,transient与类对象的序列化息息相关,序列化保存的是 类对象 状态,被transient关键字修饰的成员变量,在类的实例化对象的序列化处理过程中会被忽略,变量不会贯穿对象的序列化和反序列化,需要的朋友可以参考下
    2023-09-09
  • Spring 依赖注入和循环依赖的实例解析

    Spring 依赖注入和循环依赖的实例解析

    依赖注入的主要目的是降低类之间的耦合度,使得代码更加灵活、可维护和可测试,这篇文章主要介绍了Spring 依赖注入和循环依赖的相关知识,需要的朋友可以参考下
    2023-09-09
  • SpringData关键字查询实现方法详解

    SpringData关键字查询实现方法详解

    这篇文章主要介绍了SpringData关键字查询实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 详解Spring Boot中PATCH上传文件的问题

    详解Spring Boot中PATCH上传文件的问题

    这篇文章主要介绍了详解Spring Boot中PATCH上传文件的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12

最新评论