括號匹配(棧)


檢查一段C語言代碼的小括號( )、 中括號 [ ] 和大括號{ } 是否匹配。

輸入格式:

在一行中輸入一段C語言代碼,長度不超過1000個字符(行末以換行符結束)。

輸出格式:

第一行輸出左括號的數量和右括號的數量,中間以一個空格間隔。
若括號是匹配的,在第二行打印YES,否則打印NO

輸入樣例1:

for(int i=0; i<v; i++){ visited[i] = 0; for(int j=0; j<v; j++) scanf("%d",&(g->Adj[i][j])); }
 

輸出樣例1:

8 8
YES
 

輸入樣例2:

for(int i=0; i<v; i++) a(i]=0; 
 

輸出樣例2:

2 2 NO

思路:
注意兩點:如果沒有右括號與之匹配,不要break,要繼續統計括號的數量;滿足左括號都有右括號與之匹配,這時候可能有多余的左括號,因此不僅要判斷flag=true,還要加上棧為空
代碼:
import java.util.*;
public class Main{
      public static void main(String[] args) {
            Scanner scan=new Scanner(System.in);
            Stack<Character> sta=new Stack<Character>();
            Map<Character, Character> map=new HashMap<Character, Character>();
            map.put('(', ')');
            map.put('[', ']');
            map.put('{', '}');
            String s=scan.nextLine();
            char[] a=s.toCharArray();
            boolean flag=true;
            int cnt1=0,cnt2=0;
            for(int i=0;i<a.length;i++){
                if(a[i]=='(' ||a[i]=='[' ||a[i]=='{')  {
                      sta.push(a[i]);
                      cnt1++;
                }
                else if(a[i]==')' ||a[i]==']' ||a[i]=='}'){
                      cnt2++;
                      if(!sta.isEmpty() && map.get(sta.peek())==a[i]){
                            sta.pop();
                      }
                     else{
                           flag=false;//不要break,因為需要繼續統計數量
                     }
                }
            }
            System.out.println(cnt1+" "+cnt2);
            if(flag && sta.isEmpty()) System.out.println("YES");//判棧空
            else System.out.println("NO");
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM