我们通过顺序表创建一个栈
- 如果我们需要实现一组括号的匹配,我们首先必须知道这个括号数组当中所有的括号符号。
- 常见的括号符号也就 ‘[]’ ‘{}’ ‘()’,还有的一些奇奇怪怪的括号就不说了啊。
- 我们首先需要按思维逻辑思考,需要完成括号的左右搭配,即相同类型的括号有左也有右。那么我们必须把这个括号数组重现的遍历一遍,把左右区分开。
- 我们区分开了一个左括号,和有括号,那么如果我们借助栈,我们可以把一边的括号全部压入我们的队列·当中·。
- 最后是逐个出栈,与重新分配的有括号比较。
- 可以用上switch语句,当然不用也是·可以的,毕竟这个语句我们用的都不多。
先把我们的栈作为头文件定义好
#pragma once
#include <assert.h>
typedef char StackDataType;
#define MAX_SIZE (100)
typedef struct Stack {
StackDataType array[MAX_SIZE];
int top;
} Stack;
void StackInit(Stack *pStack)
{
pStack->top = 0;
}
void StackDestroy(Stack *pStack)
{
pStack->top = 0;
}
void StackPush(Stack *pStack, StackDataType data)
{
assert(pStack->top < MAX_SIZE);
pStack->array[pStack->top++] = data;
}
void StackPop(Stack *pStack)
{
assert(pStack->top > 0);
pStack->top--;
}
StackDataType StackTop(const Stack *pStack)
{
assert(pStack->top > 0);
return pStack->array[pStack->top - 1];
}
int StackSize(const Stack *pStack)
{
return pStack->top;
}
int StackFull(const Stack *pStack)
{
return pStack->top >= MAX_SIZE;
}
int StackEmpty(const Stack *pStack)
{
return pStack->top <= 0;
}
然后定义我们的括号数组
#include "Stack.h"
#include <string.h>
#include <stdio.h>
void BracketMatch(const char * sequence, int size)
{
Stack stack;
StackInit(&stack);
char ch;
char leftBracket;
for (int i = 0; i < size; i++) {
ch = sequence[i];
switch (ch) {
case '(':
case '[':
case '{':
StackPush(&stack, (StackDataType)ch);
break;
case ')':
case ']':
case '}':
if (StackEmpty(&stack)) {
printf("右括号多\n");
StackDestroy(&stack);
return;
}
leftBracket = (char)StackTop(&stack);
StackPop(&stack);
if (leftBracket == '(' && ch != ')') {
printf("不匹配\n");
return;
}
if (leftBracket == '[' && ch != ']') {
printf("不匹配\n");
return;
}
if (leftBracket == '{' && ch != '}') {
printf("不匹配\n");
return;
}
default:
break;
}
}
if (!StackEmpty(&stack)) {
printf("左括号多\n");
return;
}
printf("正常匹配\n");
}
void TestBracket()
{
const char * seqs[] = {
"(())abc{[(])}",
"(()))abc{[]}",
"(()()abc{[]}",
"(())abc{[]()}"
};
for (int i = 0; i < 4; i++) {
BracketMatch(seqs[i], strlen(seqs[i]));
}
}
int main()
{
TestBracket();
return 0;
}