首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言演算法:驗證大括號配對是否正確

     編輯:關於C

堆疊應用經典:括號匹配驗證

驗證程式碼中大括號 {} 是否正確配對,是編譯器語法分析的基礎功能,也是堆疊資料結構的經典應用場景。

原始程式碼分析與修正

原始程式碼存在邏輯錯誤,以下是修正後的完整版本:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SIZE 100

// 使用堆疊驗證括號匹配
int validateBraces(const char *str) {
    char stack[MAX_SIZE];
    int top = -1;
    
    for (int i = 0; str[i] != '\0'; i++) {
        if (str[i] == '{') {
            // 遇到左括號,壓入堆疊
            if (top >= MAX_SIZE - 1) {
                printf("錯誤:括號嵌套層級過深\n");
                return 0;
            }
            stack[++top] = '{';
        } else if (str[i] == '}') {
            // 遇到右括號,檢查堆疊是否為空
            if (top == -1) {
                printf("錯誤:第 %d 字符處出現多餘的右括號\n", i + 1);
                return 0;
            }
            top--; // 配對成功,彈出堆疊
        }
    }
    
    // 遍歷結束後,堆疊應為空
    if (top == -1) {
        printf("括號匹配成功!\n");
        return 1;
    } else {
        printf("錯誤:有 %d 個左括號未閉合\n", top + 1);
        return 0;
    }
}

int main() {
    char input[MAX_SIZE];
    
    printf("請輸入要檢查的字符串(僅檢查大括號): ");
    // 使用 fgets 讀取整行,包含空格
    if (fgets(input, MAX_SIZE, stdin) == NULL) {
        printf("輸入讀取失敗\n");
        return 1;
    }
    
    // 移除 fgets 讀取的換行符
    input[strcspn(input, "\n")] = '\0';
    
    validateBraces(input);
    return 0;
}

演算法核心邏輯

  1. 遇到左括號 {:壓入堆疊,記錄待匹配的左括號
  2. 遇到右括號 }:若堆疊為空 → 多餘右括號(錯誤);否則彈出堆疊頂元素(配對成功)
  3. 遍歷結束:若堆疊非空 → 有左括號未閉合(錯誤);空 → 完全匹配

原始碼錯誤分析

  • 邏輯倒置:原碼中 j++ 和 j-- 操作反了,導致判斷錯誤
  • 輸入限制:scanf("%s") 遇空格截斷,無法處理含空格的程式碼片段
  • 無錯誤位置回報:無法指出具體錯誤位置

擴展:支援多種括號

實際編譯器需同時驗證 ()、[]、{},可擴展堆疊存儲字符類型,遇右括號時檢查堆疊頂是否為對應左括號。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved