通过栈实现括号的匹配

我们通过顺序表创建一个栈

  • 如果我们需要实现一组括号的匹配,我们首先必须知道这个括号数组当中所有的括号符号。
  • 常见的括号符号也就 ‘[]’ ‘{}’ ‘()’,还有的一些奇奇怪怪的括号就不说了啊。
  • 我们首先需要按思维逻辑思考,需要完成括号的左右搭配,即相同类型的括号有左也有右。那么我们必须把这个括号数组重现的遍历一遍,把左右区分开。
  • 我们区分开了一个左括号,和有括号,那么如果我们借助栈,我们可以把一边的括号全部压入我们的队列·当中·。
  • 最后是逐个出栈,与重新分配的有括号比较。
  • 可以用上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;
}

猜你喜欢

转载自blog.csdn.net/sing_Hwang/article/details/85239359
今日推荐