首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言順序棧實現括號匹配檢測完整代碼與邏輯修正

     編輯:程式設計綜合問答

核心邏輯

  • 遇到左括號 ( [ { 入棧。
  • 遇到右括號 ) ] } 判斷棧頂是否為對應左括號,匹配則出棧,否則失敗。
  • 遍歷結束後,棧為空則匹配成功,否則失敗。

關鍵修正點

  1. 棧滿擴容邏輯:realloc 後需更新 top 指針,原代碼 S->top = S->base + S->stacksize; 正確。
  2. 入棧操作:*S->top++ = e; 正確(先賦值再移動指針)。
  3. 出棧操作:*e = *--S->top; 正確(先移動指針再取值)。
  4. 獲取棧頂:*e = *(S->top - 1); 正確。
  5. 主函數輸入處理:scanf("%s", str); 遇空格截斷,建議用 fgets(str, sizeof(str), stdin); 讀整行,並去除末尾換行符。

簡化版參考實現


#include 
#include 
#include 

#define MAX 100

typedef struct {
    char data[MAX];
    int top;
} Stack;

void init(Stack *s) { s->top = -1; }
int empty(Stack *s) { return s->top == -1; }
int push(Stack *s, char c) {
    if (s->top == MAX - 1) return 0;
    s->data[++s->top] = c;
    return 1;
}
char pop(Stack *s) { return s->data[s->top--]; }
char peek(Stack *s) { return s->data[s->top]; }

int match(char *str) {
    Stack s; init(&s);
    for (int i = 0; str[i]; i++) {
        char c = str[i];
        if (c == '(' || c == '[' || c == '{') push(&s, c);
        else if (c == ')' || c == ']' || c == '}') {
            if (empty(&s)) return 0;
            char open = pop(&s);
            if ((c == ')' && open != '(') ||
                (c == ']' && open != '[') ||
                (c == '}' && open != '{')) return 0;
        }
    }
    return empty(&s);
}

int main() {
    char str[256];
    while (fgets(str, sizeof(str), stdin)) {
        str[strcspn(str, "\n")] = 0; // 去換行
        printf("%s\n", match(str) ? "匹配正確" : "匹配失敗");
    }
    return 0;
}

採用簡化結構體與標準庫函數,邏輯更清晰,易於調試與維護。

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