有效的括号(c语言实现)

有效的括号(c语言实现)

题目

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

链接:link
在这里插入图片描述

解题思路

用栈来解决该问题非常合适,当输入为左括号时进行入栈操作,当输入为右括号时出栈,用右括号与出栈的左括号相匹配,若匹配成功则继续输入,检查是否匹配,若一直匹配则一直出栈到栈空为止,并返回ture;若不匹配则返回flase结束程序。
由于C语言没有栈容器所以自写了一个栈。分别实现栈的初始化、入栈、出栈、输出栈顶数据、输出栈的大小、栈空、摧毁栈等功能

解题代码

typedef char SDataType;

typedef struct Stack
{
	SDataType* data;
	int capacity;
	int top;
}ST;

//栈的初始化
void StackInit(ST* ps)
{
	ps->data = (SDataType*)malloc(sizeof(SDataType*) * 4);
	if (ps->data == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	ps->capacity = 4;
	ps->top = 0;//初始化给0top指向的是栈顶元素的下一个
	             //给-1则指向栈顶
}

//摧毁栈
void StackDestory(ST* ps)
{
	assert(ps);
	free(ps->data);
	ps->data = NULL;
	ps->top = ps->capacity = 0;
}

//栈顶插入删除数据
//入栈
void StackPush(ST* ps,SDataType x)
{
	assert(ps);
	if (ps->capacity == ps->top)
	{
		SDataType* newps = (SDataType*)realloc(ps->data,sizeof(SDataType*) * 2 * ps->capacity);
		
		if (newps == NULL)
		{
			printf("realloc fail\n");
			return;
		}
		else
		{
			ps->data = newps;
			ps->capacity = 2 * ps->capacity;
		}
	}

	ps->data[ps->top] = x;
	ps->top++;	
}

//出栈
void StackPop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	ps->top--;
}

//输出栈顶的数据
SDataType StackTop(ST* ps)
{
	assert(ps);
	assert(ps > 0);
	return ps->data[ps->top - 1];
}

//栈中元素的个数
int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

//判断是否栈空
bool  StackEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

bool isValid(char* s)
{
    //1、如果是左括号,入栈
    //2、右括号,出栈顶的左括号跟右括号判断是否匹配
    //如果匹配就继续如果不匹配退出
    ST st;

    StackInit(&st);

    while (*s != '\0')
    {
        switch (*s)
        {
       	 	case '{':
        	case '(':
       	    case '[':
        	{
	            StackPush(&st, *s);
	            ++s;
	            break;
        	}

	        case '}':
	        case ']':
	        case ')':
	        {
	            if (StackEmpty(&st))
	            {
	                StackDestory(&st);
	                return false;
	            }
	            else
	            {
	              char top = StackTop(&st);
	              StackPop(&st);
	            
	              if ((*s == '}' && top != '{')
	                || (*s == ')' && top != '(')
	                || (*s == ']' && top != '['))
	              {
	                StackDestory(&st);
	                return false;
             	  }
	              else
	              {
	                ++s;
	              }
	              
	              break;
	            }
	       	 }

        default:
            break;
        }
    }

    bool ret = StackEmpty(&st);
    StackDestory(&st);
    return ret;
}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

八只脚抠脚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值