驗證程式碼中大括號 {} 是否正確配對,是編譯器語法分析的基礎功能,也是堆疊資料結構的經典應用場景。
原始程式碼存在邏輯錯誤,以下是修正後的完整版本:
#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;
}
{:壓入堆疊,記錄待匹配的左括號}:若堆疊為空 → 多餘右括號(錯誤);否則彈出堆疊頂元素(配對成功)j++ 和 j-- 操作反了,導致判斷錯誤scanf("%s") 遇空格截斷,無法處理含空格的程式碼片段實際編譯器需同時驗證 ()、[]、{},可擴展堆疊存儲字符類型,遇右括號時檢查堆疊頂是否為對應左括號。