【数据结构】括号匹配问题

       给定一个字符串,其中的字符只包含三种括号:花括号{ }、中括号[ ]、圆括号( ),即它仅由 “( ) [ ] { }” 这六个字符组成。设计算法,判断该字符串是否有效,即字符串中括号是否匹配。括号匹配要求括号必须以正确的顺序配对,如 “{ [ ] ( ) }” 或 “[ ( { } [ ] ) ]” 等为正确的格式,而 “[ ( ] )”  “{ [ ( ) }” 或 “( { } ] )” 均为不正确的格式。

这个问题可以用栈stack来解决,具体的代码如下:

#pragma once #include<stdio.h> #include<assert.h> #include<string.h> //typedef int DataType; typedef char DataType; #define MAX_SIZE 100 typedef struct Stack { DataType _arr[MAX_SIZE]; int _top; }Stack; void StackInit(Stack* s) { assert(s); s->_top = 0; } int StackEmpty(Stack* s) { assert(s); return 0 == s->_top; } void StackPush(Stack* s, DataType data) { assert(s); if (s->_top == MAX_SIZE) { printf("栈已经满了!\n"); } s->_arr[s->_top] = data; s->_top++; } void StackPop(Stack* s) { assert(s); if (StackEmpty(s)) { printf("栈已经空了!\n"); return; } s->_top--; } DataType StackTop(Stack* s) { assert(s); return s->_arr[s->_top - 1]; } int StackSize(Stack* s) { assert(s); return s->_top; } // void Test() { Stack s; StackInit(&s); StackPush(&s, 1); StackPush(&s, 2); StackPush(&s, 3); StackPush(&s, 4); StackPush(&s, 5); StackPush(&s, 6); printf("size = %d\n", StackSize(&s)); printf("top = %d\n", StackTop(&s)); StackPop(&s); printf("size = %d\n", StackSize(&s)); printf("top = %d\n", StackTop(&s)); } ////括号匹配///// int isBracket(char ch) { if (('(' == ch || ')' == ch) || ('[' == ch || ']' == ch) || ('{' == ch || '}' == ch)) return 1; return 0; } int MatchBrackets(const char* pStr) { int len = 0, i = 0; Stack s; if (NULL == pStr) { return 1; } StackInit(&s); len = strlen(pStr); for (; i < len; ++i) { if (isBracket(pStr[i])) { if ('(' == pStr[i] || '[' == pStr[i] || '{' == pStr[i]) { StackPush(&s, pStr[i]); } else { if (StackEmpty(&s)) { printf("右括号比左括号多!\n"); return 0; } else { //用当前的括号和栈顶元素匹配 char top = StackTop(&s); if ('(' == top && ')' == pStr[i] || '[' == top && ')' == pStr[i] || '{' == top && '}' == pStr[i]) { StackPop(&s); } else { printf("左右括号次序匹配有误!\n"); return 0; } } } } } if (!-StackEmpty(&s)) { printf("左括号比右括号多!\n"); return 0; } printf("括号匹配正确!!!\n"); return 1; } void TestMatchBrackets() { char a[] = "(())abc{[(])}"; char b[] = "(()))abc{[]}"; char c[] = "(()()abc{[]}"; char d[] = "(())abc{[]()}"; char e[] = "{}"; MatchBrackets(a); MatchBrackets(b); MatchBrackets(c); MatchBrackets(d); MatchBrackets(e); }
#include "Stack.h" int main() { TestMatchBrackets(); system("pause"); return 0; }

以上是用C语言对栈和括号匹配问题的简单实现,代码结果如下:

《【数据结构】括号匹配问题》

    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/yaotengjian/article/details/80654682
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞