C语言使用顺序栈实现括号匹配问题

一.括号匹配问题共有四种情况:

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;

}

建议在编译器上看,如果有更好的思路和解法,欢迎大家在评论区交流,谢谢

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值