給定一個僅包含 ( ) [ ] 的字符串,判斷括號是否正確匹配。匹配規則:左括號入棧,遇右括號出棧並比對類型;最終棧為空且過程無類型不匹配,則匹配成功。
ch:ch == '(' || '[' → 入棧。ch == ')' → 若棧空或棧頂 ≠ '(',報錯「) 不匹配」;否則出棧。ch == ']' → 同理比對 '['。#include <iostream>
using namespace std;
#define MAX 100
struct Stack {
int top;
int maxSize;
char *element;
};
void init(Stack *s, int n) {
s->top = -1;
s->maxSize = n;
s->element = new char[n];
}
bool isEmpty(Stack *s) { return s->top == -1; }
bool isFull(Stack *s) { return s->top == s->maxSize - 1; }
void push(Stack *s, char x) {
if (!isFull(s)) s->element[++s->top] = x;
else cout << "棧滿" << endl;
}
char pop(Stack *s) {
if (!isEmpty(s)) return s->element[s->top--];
else { cout << "棧空" << endl; return -1; }
}
int main() {
Stack *s = new Stack;
init(s, MAX);
bool ok = true, ok1 = true, ok2 = true;
cout << "請輸入字符串:" << endl;
char ch;
while ((ch = getchar()) != '\n') {
switch (ch) {
case '(': case '[': push(s, ch); break;
case ')':
if (pop(s) != '(' && ok2) { cout << "')' 不匹配" << endl; ok1 = ok = false; }
break;
case ']':
if (pop(s) != '[' && ok1) { cout << "']' 符號不匹配" << endl; ok2 = ok = false; }
break;
}
}
if (!isEmpty(s) && ok) cout << "數量不匹配" << endl;
else if (ok) cout << "匹配" << endl;
system("pause");
return 0;
}
(])與「數量不匹配」(如 (()。std::stack<char>,代碼更簡潔安全。
擴展:同樣邏輯可處理
{ }、HTML 標籤匹配、編譯器語法分析等場景。