最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java括號匹配算法求解(用棧實(shí)現(xiàn))

 更新時間:2020年12月04日 17:33:17   作者:阿飛Sirx  
這篇文章主要介紹了java括號匹配算法求解(用棧實(shí)現(xiàn)),需要的朋友可以參考下

如何使用棧來判定括號是否匹配

對于給定的表達(dá)式,可以使用棧來實(shí)現(xiàn)括號匹配判定,這個算法在編譯器中非常重要,解析器每次讀入
一個字符,如果字符是一個開分隔符,如(,【,{,入棧,若讀入的是閉分隔符),】,},出棧,如果兩者匹配,繼續(xù)解析字符串,如果不匹配,解析器錯誤

算法思路

1.創(chuàng)建一個棧
2.當(dāng)(當(dāng)前字符不等于輸入的結(jié)束字符)
(1)如果當(dāng)前字符不是匹配的字符,判斷棧內(nèi)是否為空,如果棧為空,括號必然不完整
(2)如果字符是一個開分隔符,那么將其入棧
(3)如果字符是一個閉分隔符,,且棧不為空,則判斷是否匹配
(4)棧結(jié)束后判斷是否為空,不為空則括號匹配錯誤

代碼示例

class Solution {
  public boolean isValid(String s) {
    //聲明匹配詞典
    Map<Character, Character> map = new HashMap<>();
    map.put(')', '(');
    map.put(']', '[');
    map.put('}', '{');
    //創(chuàng)建棧
    Stack<Character> stack = new Stack<>();
    for (char ch : s.toCharArray()) {
      //開分隔符入棧
      if (ch == '(' || ch == '[' || ch == '{') {
        stack.push(ch);
      }
      //出棧并且棧非空進(jìn)行匹配
      else if (stack.isEmpty() || stack.pop() != map.get(ch)){
        return false;
      }
    }
    //如果棧非空則括號匹配錯誤
    return stack.isEmpty();
  }
}



下面是其他同學(xué)的補(bǔ)充

1.括號匹配算法

//括號匹配算法
    public void pipei()throws Exception{
      char temp,ch;
      int match;  //記錄匹配結(jié)果
      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;  //判斷是否匹配(默認(rèn)不匹配)
          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; //存放數(shù)據(jù)
    int MaxSize;  //最大容量
    int top;    //棧頂指針
    //構(gòu)造方法
    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;  //記錄匹配結(jié)果
      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;  //判斷是否匹配(默認(rèn)不匹配)
          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表示結(jié)束。支持的括號包括:{},(),[],<>。");
      stack.pipei();    //匹配算法
      System.out.print("\n繼續(xù)匹配嗎(y/n)?");
      go=input.next();
    }while(go.equalsIgnoreCase("y"));
    System.out.println("匹配結(jié)束!");
  }

}

程序運(yùn)行結(jié)果如下:

括號匹配問題!
請輸入一組括號的組合,以0表示結(jié)束。支持的括號包括:{},(),[],<>。
({[]})<>0
輸入的括號完全匹配!

繼續(xù)匹配嗎(y/n)?y
請輸入一組括號的組合,以0表示結(jié)束。支持的括號包括:{},(),[],<>。
({])0
輸入的括號不匹配,請檢查!

繼續(xù)匹配嗎(y/n)?n
匹配結(jié)束!

補(bǔ)充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;
}

到此這篇關(guān)于java括號匹配算法求解(用棧實(shí)現(xiàn))的文章就介紹到這了,更多相關(guān)java括號匹配算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java多線程中的原子類屬性說明

    Java多線程中的原子類屬性說明

    這篇文章主要介紹了Java多線程中的原子類屬性說明,對多線程訪問同一個變量,我們需要加鎖,而鎖是比較消耗性能的,JDk1.5之后,新增的原子操作類提供了一種用法簡單、性能高效、線程安全地更新一個變量的方式,需要的朋友可以參考下
    2023-10-10
  • 使用Java實(shí)現(xiàn)三種等級的掃雷游戲(完整版)

    使用Java實(shí)現(xiàn)三種等級的掃雷游戲(完整版)

    掃雷是一款大眾類的益智小游戲,根據(jù)點(diǎn)擊格子出現(xiàn)的數(shù)字找出所有非雷格子,同時避免踩雷,踩到一個雷即全盤皆輸,下面這篇文章主要給大家介紹了關(guān)于使用Java實(shí)現(xiàn)三種等級的掃雷游戲的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Java調(diào)用pyzbar解析base64二維碼過程解析

    Java調(diào)用pyzbar解析base64二維碼過程解析

    這篇文章主要介紹了Java調(diào)用pyzbar解析base64二維碼過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Spring組件開發(fā)模式支持SPEL表達(dá)式

    Spring組件開發(fā)模式支持SPEL表達(dá)式

    今天小編就為大家分享一篇關(guān)于Spring組件開發(fā)模式支持SPEL表達(dá)式,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • SpringBoot JPA懶加載失效的解決方案(親測有效)

    SpringBoot JPA懶加載失效的解決方案(親測有效)

    這篇文章主要介紹了SpringBoot JPA懶加載失效的解決方案(親測有效),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • IntelliJ IDEA報(bào)錯Error:java: Compilation failed: internal java compiler error的解決辦法

    IntelliJ IDEA報(bào)錯Error:java: Compilation failed: internal java

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA報(bào)錯Error:java: Compilation failed: internal java compiler error的解決辦法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • java中transient關(guān)鍵字分析

    java中transient關(guān)鍵字分析

    這篇文章主要介紹了java中transient關(guān)鍵字分析,transient與類對象的序列化息息相關(guān),序列化保存的是 類對象 狀態(tài),被transient關(guān)鍵字修飾的成員變量,在類的實(shí)例化對象的序列化處理過程中會被忽略,變量不會貫穿對象的序列化和反序列化,需要的朋友可以參考下
    2023-09-09
  • Spring?依賴注入和循環(huán)依賴的實(shí)例解析

    Spring?依賴注入和循環(huán)依賴的實(shí)例解析

    依賴注入的主要目的是降低類之間的耦合度,使得代碼更加靈活、可維護(hù)和可測試,這篇文章主要介紹了Spring?依賴注入和循環(huán)依賴的相關(guān)知識,需要的朋友可以參考下
    2023-09-09
  • SpringData關(guān)鍵字查詢實(shí)現(xiàn)方法詳解

    SpringData關(guān)鍵字查詢實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了SpringData關(guān)鍵字查詢實(shí)現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 詳解Spring Boot中PATCH上傳文件的問題

    詳解Spring Boot中PATCH上傳文件的問題

    這篇文章主要介紹了詳解Spring Boot中PATCH上傳文件的問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12

最新評論

铜山县| 嘉鱼县| 淮南市| 鄂温| 施甸县| 习水县| 福清市| 阿坝县| 海安县| 禄丰县| 奉新县| 西藏| 岳阳市| 吉木乃县| 沅陵县| 凯里市| 广宗县| 鹤山市| 中宁县| 乌兰浩特市| 开鲁县| 东台市| 普陀区| 龙井市| 黎平县| 精河县| 广东省| 壤塘县| 乐安县| 平顺县| 肇州县| 尚义县| 芷江| 永兴县| 涿州市| 南江县| 磐石市| 泰兴市| 昭觉县| 乐清市| 澳门|