括号匹配编码c语言,括号匹配(c语言实现)

1要求

编写程序检查该字符串的括号是否成对出现,而且不能交叉出现。

输入:

一个字符串,里边可能包含“()”、"{}"、“[]”三种括号,“#”结束

输出:

成功:代表括号成对出现并且嵌套正确

失败:未正确使用括号字符。

2分析

用一个栈,就能解决该问题,左括号栈顶字符必须和第一个入栈的右括号字符匹配。

栈介绍:栈是一种特殊的线性表,仅能在线性表的一端操作。

栈的特性:后进先出(lifo)

由于正在学数据结构,于是栈的定义与操作都是自己编写的,为了巩固概念

3代码

#include

#include

#define stack_int_size 100

#define stackincrement 10

#define bool int //自定义bool变量

#define selemtype char

typedef struct {

selemtype *base; //栈基地址

selemtype *top; //栈顶地址

int stacksize;

} sqstack;

//------基本操作的算法描述------

//构建一个空栈

bool initstack(sqstack *s) {

s->base = (selemtype *) malloc(stack_int_size * sizeof(selemtype)); //开辟新的空间

if (!s->base) return 0; //开辟失败返回0

s->top = s->base;

s->stacksize = stack_int_size;

return 1;

}

//若栈不为空,返回栈顶元素,并返回true 否则返回 false

bool gettop(sqstack s) {

if (s.top == s.base) return 0;

return *(s.top - 1);

}

//插入元素 为新的栈顶元素

bool push(sqstack *s, selemtype e) {

if (s->top - s->base >= s->stacksize) //如果栈满 需要增加空间

{

s->base = (selemtype *) realloc(s->base, (s->stacksize + stackincrement) * sizeof(selemtype));

if (!s->base) return 0;

s->top = s->base + s->stacksize;

s->stacksize += stackincrement;

}

*(s->top++) = e;

return 1;

}

//若栈不为空,则删除栈顶元素,用e返回其值,返回true, 否则返回false

bool pop(sqstack *s, selemtype *e) {

if (s->top == s->base) return 0;

*e = *(--s->top);

return 1;

}

//检查括号字符在字符集中的位置

int checkchar(char c, char op[]) {

int i;

for (i = 0; i < 3; i++)

if (c == op[i])return i;

return 999;

}

int main() {

sqstack optr;

initstack(&optr);

push(&optr, '#');

printf("输入括号以“#”结尾\n");

char c;

c = getchar();

int m = 1; //判断最终是否完全匹配 完全匹配 值为1,否则为0

char op1[] = {'[', '(', '{'}; //前置括号字符集

char op2[] = {']', ')', '}'}; //后置括号字符集

while (c != '#') {

if (checkchar(c, op1) < 3) {

push(&optr, c);

c = getchar();

} else {

if (checkchar(gettop(optr), op1) == checkchar(c, op2)) {

//如果需要检验的两个符号在前置和后置括号集中的位置相同则表示配对成功

//例如[和],[在前置括号集中的位置1,]在后置括号集中的位置1,所以匹配成功

pop(&optr, &c);

c = getchar();

continue;

} else {

m = 0;

break;

}

}

}

if (gettop(optr) != c)m = 0;

if (m == 1)printf("\n括号完全匹配!");

else printf("\n括号匹配失败!");

return 0;

}

遇到此类问题,但看了文章还是未解决,

评论或加 qq:781378815

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值