栈在解决括号匹配问题中是一个非常有用的工具。括号匹配问题主要出现在编程语言和数学表达式中,需要确保每种类型的开括号(如小括号"()",大括号"{}",方括号"[]")都有相应的闭括号与之匹配,并且这些括号的顺序是正确的。
#define maxSize 1024
//括号匹配函数
bool match(char* str)
{
char stack[maxSize];
//栈顶序号
int top = -1;
//str作为指针用
while (*str != '\0')
{
//匹配的思路是,对括号进行出栈和入栈操作
//如果是( 则入栈,如果是 )则与栈顶匹配,如果成功,则出栈
//如果失败,则表示括号不匹配
if (*str == '(' || *str == '[' || *str == '{')
{
top++;
if (top >= maxSize)
{
printf("栈溢出\n");
return;
}
stack[top] = *str;
}
if (*str == ')')
{
//相等则出栈
if (stack[top] == '(')
{
top--;
}
//如果不匹配则返回false
else
{
return false;
}
}
if (*str == ']')
{
//相等则出栈
if (stack[top] == '[')
{
top--;
}
//如果不匹配则返回false
else
{
return false;
}
}
if (*str == '}')
{
//相等则出栈
if (stack[top] == '{')
{
top--;
}
//如果不匹配则返回false
else
{
return false;
}
}
str++;
}
//已经将字符串遍历完
//如果栈中没有括号,那么说明全部匹配
if (top == -1)
{
return true;
}
else
{
return false;
}
}
int main()
{
char str[1024];
fgets(str, 1024, stdin);
if (match(str))
{
printf("匹配\n");
}
else
{
printf("不匹配\n");
}
return 0;
}
match
函数
- 循环遍历字符串:函数首先通过
while
循环遍历字符串中的每一个字符。 - 处理开括号:如果字符是开括号(
(
、[
、{
),则将其压入栈中,并更新栈顶位置。 - 处理闭括号:如果字符是闭括号(
)
、]
、}
),则检查栈顶是否为对应的开括号。如果是,则将栈顶元素出栈(即弹出);如果不是,则返回false
,表示括号不匹配。 - 遍历结束后:如果栈为空(即
top == -1
),则说明所有括号都匹配,返回true
;否则,返回false
,表示还有未匹配的括号。
请注意,这个示例代码没有处理栈溢出的情况,只是简单地检查栈是否已满。在实际应用中,你可能需要更复杂的错误处理机制来确保程序的健壮性。此外,代码假设输入字符串不会超过 MAX_SIZE
,这也需要在实际使用时加以考虑。