代码:
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
typedef struct Node {
char data;
struct Node *next;
} Node;
typedef struct Stack {
Node *top;
Node *base;
} Stack;
bool stackEmpty(Stack &S) {
return S.top == S.base;
}
void initStack(Stack &S) {
// 栈中没有元素时,S.top == S.base
S.base = (Node *) malloc(sizeof(Node));
S.base->next = nullptr;
S.top = S.base;
}
void push(Stack &S, char e) {
// 在栈顶插入一个元素e
S.top->data = e;
Node *p = (Node *) malloc(sizeof(Node));
p->next = S.top;
S.top = p;
}
int pop(Stack &S, char &e) {
// 删除栈顶元素
if (stackEmpty(S))
return 0;
Node *p = S.top;
S.top = S.top->next;
e = S.top->data;
free(p);
return 1;
}
bool isValid(string str) {
Stack S;
initStack(S);
for (int i = 0; i < str.length(); i++) {
if (str[i] == '(' || str[i] == '[' || str[i] == '{') { // 扫描到左括号,入栈
push(S, str[i]);
} else {
if (stackEmpty(S)) // 扫描到右括号,且当前栈空
{
return false;
}
char topElem;
pop(S, topElem); // 栈顶元素出栈
if (str[i] == ')' && topElem != '(')
return false;
if (str[i] == ']' && topElem != '[')
return false;
if (str[i] == '}' && topElem != '{')
return false;
}
}
return stackEmpty(S); // 检验完全部括号,栈空说明匹配成功
}
int main() {
cout << boolalpha;
cout << "isValid(\"\") = " << isValid("") << endl; // true
cout << "isValid(\"(\") = " << isValid("(") << endl; // false
cout << "isValid(\"((){}\") = " << isValid("((){}") << endl; // false
cout << "isValid(\"(){}[[]\") = " << isValid("(){}[[]") << endl; // false
cout << "isValid(\"{[({})]}\") = " << isValid("{[({})]}") << endl; // true
cout << "isValid(\"{(){}{[()]}}\") = " << isValid("{(){}{[()]}}") << endl; // true
}
运行结果: