一.括号匹配问题共有四种情况:
1.左右括号匹配不正确
2.左括号多于右括号
3.右括号多于左括号
4.左右括号匹配正确
二.我的思路:
使用顺序栈,先初始化栈结构,再实现匹配操作,如果遇到左括号,就入栈,要事先判断栈是否满了,满了就返回,不满就继续入栈。如果遇到右括号,就实现出栈操作,这时要判断栈是否为空,如果为空,说明右括号多于左括号,返回一个值,不为空判断括号是否匹配,匹配和不匹配都要返回值。如果全部匹配,则循环结束后再判断栈是否为空,不为空则左括号还有,右括号已经没有了,说明左括号多于右括号,要有返回值,如果为空,左右括号匹配,返回一个值
三.完整代码:
文件“stack.h”的内容如下:
#define maxsize 100
char c[maxsize];
int top;
//初始化栈
void stackinitiate(int* p)
{
*p = 0;
}
//判断栈是否空
int stackempty(int* p)
{
if (*p == 0)//空栈
return 1;
else
return 0;//不是空栈
}
//元素入栈
void stackpush(int* p, char t)
{
if(*p >= maxsize)
{
printf("栈已满,无法插入\n");
return;
}
else
{
c[*p] = t;
(*p)++;
}
}
//元素出栈判断
int stackout(int* p, char g)
{
if (stackempty(&top))
return -1;//左括号少于右括号
else
if (((c[*p - 1] == '(') && (g == ')')) || ((c[*p - 1] == '[') && (g == ']')) || ((c[*p - 1] == '{') && (g == '}')))
{
(*p)--;
return 1;//括号匹配
}
else
return 0;//括号不匹配
}
//括号匹配
int match(char s[80])
{
int i,a;
for (i = 0; s[i] != '\0'; i++)
{
if ((s[i] == '(') || (s[i] == '[') || (s[i] == '{'))
stackpush(&top, s[i]);//元素入栈
if ((s[i] == ')') || (s[i] == ']') || (s[i] == '}'))
{
a=stackout(&top, s[i]);
if (a == -1)
return 3;//左括号少于右括号
else
if (a == 1)
continue;//暂时满足括号匹配,继续判断
else
return 0;//括号不匹配
}
}
if (stackempty(&top))
return 1;//括号匹配
else
return 2;//左括号多于右括号
}
文件code.c的内容如下(主函数):
#include <stdio.h>
#include "stack.h"
int main()
{
char s[80];
printf("请输入字符串\n");
scanf_s("%s", s, 80);
//初始化栈
stackinitiate(&top);
//括号匹配
int b=match(s);
//判断
if (b == 0)
printf("左括号与右括号不匹配\n");
else
if (b == 2)
printf("左括号多于右括号\n");
else
if (b == 3)
printf("右括号多于左括号\n");
else
printf("括号匹配\n");
return 0;
}
建议在编译器上看,如果有更好的思路和解法,欢迎大家在评论区交流,谢谢