-
遇到“左括号”就进0栈 遇到“右括号”就与栈顶元素进行匹配,匹配上就出栈,不匹配就报错
-
匹配步骤:
- 扫描序列,遇到左括号,就入栈,遇到右括号,就用当前这个右括号与栈顶元素进行匹配,匹配上就将栈顶元素弹出
- 右括号与当前栈顶元素匹配不上就说明有问题
- 序列扫描完毕,但栈中还有元素,说明有问题
- 栈空,但是再扫描序列,发现是一个右括号,说明有问题
- 否则:序列扫描完毕,且栈为空,则匹配成功
#include <stdio.h>
#define MaxSize 20
typedef struct SNode {
char data[MaxSize];
int len;
int top;
}Stack, * LStack;
//初始化
void initStack(LStack s) {
s->top = -1;
s->len = MaxSize;
}
// 判空
int isEmpty(LStack s) {
if (s->top == -1)return 1;
return 0;
};
// 判满
int isFull(LStack s) {
if (s->top == MaxSize - 1)return 1;
return 0;
}
// 入队操作
int push(LStack s, char data) {
if (isFull(s))return -1;
s->data[++s->top] = data;
return 1;
}
// 出队操作
char pop(LStack s) {
if (isEmpty(s))return -1;
return s->data[s->top--];
}
// 得到栈顶元素
char getTop(LStack s) {
if (isEmpty(s))return -1;
return s->data[s->top];
}
int match(LStack s,char strs[]) {
int i = 0;
while (strs[i])
{
if (strs[i] == '[' || strs[i] == '{' || strs[i] == '(') {
int flag = push(s, strs[i]);
if (flag == -1)return -1;
}
else if (strs[i] == ']' && pop(s) != '[')return -1;
else if (strs[i] == '}' && pop(s) != '{')return -1;
else if (strs[i] == ')' && pop(s) != '(')return -1;
i++;
}
if (s->top != -1)return -1;
return 1;
}
int main() {
Stack s;
initStack(&s);
char arr[] = "{}{}{}][";
int i = match(&s, arr);
if (i == 1)printf("匹配成功");
else printf("匹配失败");
return 0;
}