括号匹配问题

给定一个字符串,其中的字符只包含三种括号:{ }、[ ]、( ),即它仅由 “( ) [ ] { }” 这六个字符组

成。编写代码,判断该字符串是否有效。

有效字符串需满足:

1.左括号必须以相同类型的右括号闭合。

2.左括号必须以正确的顺序闭合。

如:s="()" 返回true    s=="([{]" 返回false

#include <stdio.h>
#include "stdbool.h"
#include "malloc.h"
#include "assert.h" 
#define LinkElemtype char
typedef struct LinkStackNode
{
	LinkElemtype data;
	struct LinkStackNode* next;
}LinkStackNode;

typedef struct LinkStack
{
	LinkStackNode* head;
}LinkStack;

// 初始化栈 
void LinkStackInit(LinkStack* ps);
// 入栈 
void LinkStackPush(LinkStack* ps, LinkElemtype v);
// 出栈 
void LinkStackPop(LinkStack* ps);
// 获取栈顶元素 
int LinkStackTop(LinkStack* ps);
//判空
bool LinkEmpty(LinkStack* ps)
{
	assert(ps != NULL);
	return ps->head == NULL;
}

void LinkStackInit(LinkStack* ps)
{
	assert(ps != NULL);
	ps->head = NULL;
}

void LinkStackPush(LinkStack* ps,LinkElemtype v)
{
	assert(ps != NULL);
	LinkStackNode* s = (LinkStackNode*)malloc(sizeof(LinkStackNode));
	assert(s!= NULL);
	s->data = v;
	s->next = ps->head;
	ps->head = s;
}

void LinkStackPop(LinkStack* ps)
{
	assert(ps != NULL);
	if (LinkEmpty(ps))
	{
		printf("栈空");
		return;
	}
	LinkStackNode* p = ps->head;
	ps->head = p->next;	
}

int LinkStackTop(LinkStack* ps)
{
	assert(ps != NULL);
	if (LinkEmpty(ps))
	{
		printf("栈空");
		return 0;
	}
	return ps->head->data;
}

bool isValid(char * s){
    if(s==NULL)
    return false;

    LinkStack st;
    LinkStackInit(&st);

    while(*s!='\0')
    {
        if(*s=='('||*s=='['||*s=='{')
        {
        LinkStackPush(&st,*s);
        }
        else
        {
            if(LinkEmpty(&st))
             return false;
            char top=LinkStackTop(&st);
            if((*s==')'&&top!='(')||(*s==']'&&top!='[')||(*s=='}'&&top!='{'))
            return false;
            LinkStackPop(&st);
        }
        s++;
    }
    if(!LinkEmpty(&st))
    return false;
    return true;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值