给定一个字符串,其中的字符只包含三种括号:花括号{ }、中括号[ ]、圆括号( ),即它仅由 “( ) [ ] { }” 这六个字符组成。设计算法,判断该字符串是否有效,即字符串中括号是否匹配。括号匹配要求括号必须以正确的顺序配对,如 “{ [ ] ( ) }” 或 “[ ( { } [ ] ) ]” 等为正确的格式,而 “[ ( ] )” 或 “{ [ ( ) }” 或 “( { } ] )” 均为不正确的格式。
这个问题可以用栈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语言对栈和括号匹配问题的简单实现,代码结果如下: