( [ { 入棧。) ] } 判斷棧頂是否為對應左括號,匹配則出棧,否則失敗。realloc 後需更新 top 指針,原代碼 S->top = S->base + S->stacksize; 正確。*S->top++ = e; 正確(先賦值再移動指針)。*e = *--S->top; 正確(先移動指針再取值)。*e = *(S->top - 1); 正確。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;
}
採用簡化結構體與標準庫函數,邏輯更清晰,易於調試與維護。