java括號(hào)匹配算法求解(用棧實(shí)現(xiàn))
如何使用棧來(lái)判定括號(hào)是否匹配
對(duì)于給定的表達(dá)式,可以使用棧來(lái)實(shí)現(xiàn)括號(hào)匹配判定,這個(gè)算法在編譯器中非常重要,解析器每次讀入
一個(gè)字符,如果字符是一個(gè)開(kāi)分隔符,如(,【,{,入棧,若讀入的是閉分隔符),】,},出棧,如果兩者匹配,繼續(xù)解析字符串,如果不匹配,解析器錯(cuò)誤
算法思路
1.創(chuàng)建一個(gè)棧
2.當(dāng)(當(dāng)前字符不等于輸入的結(jié)束字符)
(1)如果當(dāng)前字符不是匹配的字符,判斷棧內(nèi)是否為空,如果棧為空,括號(hào)必然不完整
(2)如果字符是一個(gè)開(kāi)分隔符,那么將其入棧
(3)如果字符是一個(gè)閉分隔符,,且棧不為空,則判斷是否匹配
(4)棧結(jié)束后判斷是否為空,不為空則括號(hào)匹配錯(cuò)誤
代碼示例
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()) {
//開(kāi)分隔符入棧
if (ch == '(' || ch == '[' || ch == '{') {
stack.push(ch);
}
//出棧并且棧非空進(jìn)行匹配
else if (stack.isEmpty() || stack.pop() != map.get(ch)){
return false;
}
}
//如果棧非空則括號(hào)匹配錯(cuò)誤
return stack.isEmpty();
}
}
下面是其他同學(xué)的補(bǔ)充
1.括號(hào)匹配算法
//括號(hào)匹配算法
public void pipei()throws Exception{
char temp,ch;
int match; //記錄匹配結(jié)果
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
ch=(char) br.read(); //輸入一個(gè)字符
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); //將輸入的括號(hào)字符入棧
}
}
ch=(char) br.read(); //輸入下一個(gè)字符
}
if(isEmpty()){
System.out.println("輸入的括號(hào)完全匹配!");
}else{
System.out.println("輸入的括號(hào)不匹配,請(qǐng)檢查!");
}
}
2.括號(hào)匹配求解示例
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("棧已滿(mǎn)!");
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()];
}
//括號(hào)匹配算法
public void pipei()throws Exception{
char temp,ch;
int match; //記錄匹配結(jié)果
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
ch=(char) br.read(); //輸入一個(gè)字符
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); //將輸入的括號(hào)字符入棧
}
}
ch=(char) br.read(); //輸入下一個(gè)字符
}
if(isEmpty()){
System.out.println("輸入的括號(hào)完全匹配!");
}else{
System.out.println("輸入的括號(hào)不匹配,請(qǐng)檢查!");
}
}
}
public static void main(String[] args) throws Exception {
String go;
Scanner input = new Scanner(System.in);
Stack stack = new Stack(20);
System.out.println("括號(hào)匹配問(wèn)題!");
do{
System.out.println("請(qǐng)輸入一組括號(hào)的組合,以0表示結(jié)束。支持的括號(hào)包括:{},(),[],<>。");
stack.pipei(); //匹配算法
System.out.print("\n繼續(xù)匹配嗎(y/n)?");
go=input.next();
}while(go.equalsIgnoreCase("y"));
System.out.println("匹配結(jié)束!");
}
}
程序運(yùn)行結(jié)果如下:
括號(hào)匹配問(wèn)題!
請(qǐng)輸入一組括號(hào)的組合,以0表示結(jié)束。支持的括號(hào)包括:{},(),[],<>。
({[]})<>0
輸入的括號(hào)完全匹配!繼續(xù)匹配嗎(y/n)?y
請(qǐng)輸入一組括號(hào)的組合,以0表示結(jié)束。支持的括號(hào)包括:{},(),[],<>。
({])0
輸入的括號(hào)不匹配,請(qǐng)檢查!繼續(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) // 不考慮棧滿(mǎn)
{
*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括號(hào)匹配算法求解(用棧實(shí)現(xiàn))的文章就介紹到這了,更多相關(guān)java括號(hào)匹配算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Java動(dòng)態(tài)創(chuàng)建Flowable會(huì)簽?zāi)P偷氖纠a
動(dòng)態(tài)創(chuàng)建流程模型,尤其是會(huì)簽(Parallel Gateway)模型,是提升系統(tǒng)靈活性和響應(yīng)速度的關(guān)鍵技術(shù)之一,本文將通過(guò)Java編程語(yǔ)言,深入探討如何在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建包含會(huì)簽環(huán)節(jié)的Flowable流程模型,需要的朋友可以參考下2024-05-05
Java中一個(gè)for語(yǔ)句導(dǎo)致無(wú)窮大死循環(huán)的例子
這篇文章主要介紹了Java中一個(gè)for語(yǔ)句導(dǎo)致無(wú)窮大死循環(huán)的例子,本文給出的是一個(gè)很特別的例子,這個(gè)例子會(huì)跟你所想的結(jié)果不一樣,需要的朋友可以參考下2015-06-06
springboot項(xiàng)目獲取請(qǐng)求頭當(dāng)中的token的方法
本文主要介紹了springboot項(xiàng)目獲取請(qǐng)求頭當(dāng)中的token的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
SpringBoot中yml多環(huán)境配置的3種方法
這篇文章主要給大家介紹了SpringBoot中yml多環(huán)境配置的3種方法,文中有詳細(xì)的代碼示例供大家參考,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-10-10
Java基于socket實(shí)現(xiàn)簡(jiǎn)易聊天室實(shí)例
這篇文章主要介紹了Java基于socket實(shí)現(xiàn)簡(jiǎn)易聊天室的方法,實(shí)例分析了java基于socket實(shí)現(xiàn)聊天室服務(wù)端與客戶(hù)端的相關(guān)技巧,需要的朋友可以參考下2015-05-05
multi-catch和try-catch異常處理知識(shí)點(diǎn)詳解
在本篇文章里我們給大家分享了一篇關(guān)于multi-catch和try-catch異常處理知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。2019-11-11

