LeetCode--20 有效的括号

题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

思路:
1.使用语言:c
2.实现运用的知识: 栈的后进先出
3.大概实现:遍历字符串,让左括号入栈。如遇上右括号,则判断栈顶的数据是否为与之匹配的左括号(1.栈为空则不满足条件;2.括号不匹配也不满足),判断完后,将栈顶的数据做出栈操作。
4.遍历完字符串还需判断栈是否为空,不为空则说明存在不匹配的括号。

以下是代码实现
1.需注意的是:栈要自己实现。

#define SDataType char 

typedef struct Stack
{
	int _top;   // _top表示栈最后一个元素的位置
	SDataType _array[4000];
	int _capacity;
}Stack;
//初始化栈
void InitStack(Stack* pStack)
{
	assert(pStack);
	pStack->_top = 0;        //栈内无元素,初始化栈顶位置为零;
	pStack->_capacity = 4000;
	
}
//入栈(插入元素)
void PushStack(Stack* pStack, SDataType x)
{
	assert(pStack);
	pStack->_array[pStack->_top] = x;
	pStack->_top++;
}
//出栈(删除元素)
void PopStack(Stack* pStack)
{
	assert(pStack);
	if (pStack->_top == 0)
	{
		printf("该堆已删空 ");
		exit(1);
	}
	pStack->_top--;
}
//获取栈顶元素
SDataType  StackTop(Stack* pStack)
{
	assert(pStack);
	if (pStack->_top == 0)
	{
		printf("无数据获取!\n");
		exit(-1);
	}
	return pStack->_array[pStack->_top - 1];
}
//栈是否为空(是返回true,否返回false)
bool EmptyStack(Stack* pStack)
{
	assert(pStack);
	if (pStack->_top == 0)
	{
		return true;
	}
	return false;
}

bool isValid(char * s){
    Stack st ;
    InitStack(&st);
    int ret = 0 ;   
    while(*s != '\0')
    {
        //左括号进队列
        if( (*s == '(') || (*s == '[') || (*s == '{'))
            PushStack(&st,*s);
        else
        {
            if(EmptyStack(&st))//栈为空说明里面无左括号,不满足条件。
            {
                return false;
            }
            if(*s == ')' && StackTop(&st) != '(')
            {
                 return false;
            }
            if(*s == '}' && StackTop(&st) != '{')
            {
                 return false;
            }
            if(*s == ']' && StackTop(&st) != '[')
            {
                 return false;;
            }
            PopStack(&st);
        }
        ++s;
    }
    //遍历完如果栈内无元素,说明所有括号匹配,返回ture;反之返回false;
   return EmptyStack(&st);
   
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值