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動態(tài)創(chuàng)建Flowable會簽?zāi)P偷氖纠a
動態(tài)創(chuàng)建流程模型,尤其是會簽(Parallel Gateway)模型,是提升系統(tǒng)靈活性和響應(yīng)速度的關(guān)鍵技術(shù)之一,本文將通過Java編程語言,深入探討如何在運(yùn)行時動態(tài)地創(chuàng)建包含會簽環(huán)節(jié)的Flowable流程模型,需要的朋友可以參考下2024-05-05Java中一個for語句導(dǎo)致無窮大死循環(huán)的例子
這篇文章主要介紹了Java中一個for語句導(dǎo)致無窮大死循環(huán)的例子,本文給出的是一個很特別的例子,這個例子會跟你所想的結(jié)果不一樣,需要的朋友可以參考下2015-06-06springboot項(xiàng)目獲取請求頭當(dāng)中的token的方法
本文主要介紹了springboot項(xiàng)目獲取請求頭當(dāng)中的token的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11SpringBoot中yml多環(huán)境配置的3種方法
這篇文章主要給大家介紹了SpringBoot中yml多環(huán)境配置的3種方法,文中有詳細(xì)的代碼示例供大家參考,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-10-10Java基于socket實(shí)現(xiàn)簡易聊天室實(shí)例
這篇文章主要介紹了Java基于socket實(shí)現(xiàn)簡易聊天室的方法,實(shí)例分析了java基于socket實(shí)現(xiàn)聊天室服務(wù)端與客戶端的相關(guān)技巧,需要的朋友可以參考下2015-05-05multi-catch和try-catch異常處理知識點(diǎn)詳解
在本篇文章里我們給大家分享了一篇關(guān)于multi-catch和try-catch異常處理知識點(diǎn)內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。2019-11-11