C语言实现括号匹配算法面试题(栈实现)

1.用栈实现括号匹配算法:
感兴趣的小伙伴可以打开力扣(https://leetcode-cn.com)自己尝试做一下,一定要亲自动手做!

typedef char DataType;

typedef struct Stack
{
	DataType* array;//存放元素
	int capacity;//栈的容量
	int size;// 表示栈中有多少个元素---栈顶
}Stack;

//初始化
void StackInit(Stack* ps)
{
	assert(ps);
	ps->array = (DataType*)malloc(sizeof(DataType) * 3);
	if (ps->array == NULL)
	{
		assert(0);
		return;
	}
	ps->capacity = 3;
	ps->size = 0;
}

//扩容
void CheckCapacity(Stack* ps)
{
	assert(ps);
	if (ps->size == ps->capacity)
	{
		ps->array = (DataType*)realloc(ps->array, sizeof(DataType) * ps->capacity * 2);
		if (ps->array == NULL)
		{
			assert(0);
			return;
		}
		ps->capacity *= 2;
	}
}
//入栈
void StackPush(Stack * ps, DataType data)
{
	assert(ps);
	CheckCapacity(ps);
	ps->array[ps->size++] = data;
}

//出栈
void StackPop(Stack* ps)
{
	assert(ps);
	if (StackEmpty(ps))
	{
		return;
	}
	ps->size--;
}

//获取栈顶元素
DataType StackTop(Stack* ps)
{
	assert(ps && !StackEmpty(ps));

	return ps->array[ps->size - 1];
}

//获取栈中元素个数
int StackSize(Stack* ps)
{
	assert(ps);
	return ps->size;
}

//判空
int StackEmpty(Stack* ps)
{
	assert(ps);
	return ps->size == 0;
}

//销毁栈
void StackDestroy(Stack* ps)
{
	assert(ps);
	if (ps->array)
	{
		free(ps->array);
		ps->capacity = 0;
		ps->size = 0;
	}

}
bool isValid(char * s){
    bool flag =false;
    Stack st;
    StackInit(&st);
    //"("  ")"
    for(int i=0;i<strlen(s);++i)
    {
        if(s[i]=='('||s[i]=='['||s[i]=='{')
        {
            StackPush(&st,s[i]);
        }
        else
        {  //当前拿到的括号是右括号
           //但是刚好栈是空的
           // ")"
            if(StackEmpty(&st))
            {   StackDestroy(&st);
                return false;
            }
            char top=StackTop(&st);
            if((s[i]==')'&& top=='('
                ||s[i]==']'&& top=='['
                ||s[i]=='}'&& top=='{'))
            {
                StackPop(&st);
            }
            else
            {
                break;
            }
        }
    }
    // ")"
    if(StackEmpty(&st))
    {
        flag=true;
    }
    StackDestroy(&st);
    return flag;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值