栈与队列LeetCode刷题

①括号匹配问题

1)题目链接

题目链接https://leetcode-cn.com/problems/valid-parentheses/

2)

typedef char STDatatype;

typedef struct Stack{
	STDatatype* a;  //栈起始位置
	int top;    //栈顶位置
	int capacity;  //栈的容量
}ST;

void StackInit(ST* ps);
void StackDestroy(ST* ps);
void StackPush(ST* ps, STDatatype x);
void StackPop(ST* ps);
STDatatype StackTop(ST* ps);
int StackSize(ST* ps);
bool StackEmpty(ST* ps);

void StackInit(ST* ps){
	ps->a = (STDatatype*)malloc(sizeof(STDatatype)* 4);
	ps->capacity = 4;
	ps->top = 0;
	/*
	1)如果top 选择初始为 0,则在每次入栈或者出栈之后,
	top指向的都是栈顶元素的下一个位置。
	2)如果top 选择初始为 1,则在每次入栈或者出栈之后,
	top指向的都是栈顶元素的当前位置。
	*/
}


void StackDestroy(ST* ps){
	assert(ps);
	free(ps->a);
	ps->a = NULL; 
	ps->capacity = ps->top = 0;
}


void StackPush(ST* ps, STDatatype x){
	assert(ps);
	
	//入栈之前要判断原栈是否已经满了
	if (ps->top == ps->capacity){
		STDatatype* tmp = (STDatatype*)realloc(ps->a, ps->capacity * 2 * sizeof(STDatatype));
		//判断是否有足够的空间来扩容
		if (tmp == NULL){
			printf("realloc fail!");
			exit(-1);
		}
		else{
			ps->a = tmp;
			ps->capacity *= 2;
		}
	}

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


void StackPop(ST* ps){
	assert(ps);
	//倘若原来栈中没有元素,则top = 0,这时候调用StackPop直接报错。
	assert(ps->top > 0);

	//通过直接调用top--,直接可以达到栈顶元素出栈的效果
	ps->top--;
}


STDatatype StackTop(ST* ps){
	assert(ps);
	//倘若原来栈中没有元素,则top = 0,这时候调用StackTop直接报错。
	assert(ps->top > 0);

	return ps->a[(ps->top) - 1];
}


bool StackEmpty(ST* ps){
	assert(ps);
	//采用return后面直接接表达式的方式
	//1)如果top为0,则直接返回true
	//2)如果top不等于,则直接返回false
	return ps->top == 0;
}


bool isValid(char * s){
    ST st;
    StackInit(&st);
    //当输入的括号串未结束时
    while(*s != '\0'){
        switch(*s){
            case('('):
            case('['):
            case('{'):
            {
                //当输入的是左括号时,则入栈
                StackPush(&st,*s);
                ++s;
                break;
            }
            case(')'):
            case(']'):
            case('}'):
            {
                //当输入的是右括号时,出栈顶左括号,与输入的右括号匹配
                //如果栈中没有元素(这种情况可能由右括号比左括号多导致,也可能输入的全是右括号)
                if(st.top == 0){
                    StackDestroy(&st);
                    return false;
                }
                //将栈顶元素m弹出,与输入字符s比较
                char m = StackTop(&st);
                StackPop(&st);
                //不匹配的三种情况
                if((m == '(' && *s != ')')
                ||(m == '{' && *s != '}')
                ||(m == '[' && *s != ']')){
                    StackDestroy(&st);
                    return false;
                }
                //如果匹配
                else{
                    ++s;
                    break;
                }
            }
        }
    }
    //如果输入的字符全是左括号,则将一直入栈,最后遇到'\0'结束循环,此时栈中还有很多元素,
    //所以这里应该用栈是否空来判断是否匹配
    bool ret = StackEmpty(&st);
    StackDestroy(&st);
    return ret;
}

3)解题思路:使用栈来实现,由于输入的符号既含有左括号与右括号,可以考虑遇到左括号时,将左括号入栈,遇到右括号时,将栈顶的左括号弹出,与右括号进行匹配。

1.如果匹配成功,则继续检查输入的下一个右括号,当字符串检查结束时,判断栈是否为空,如果栈空,说明入栈的所有左括号全部匹配成功,说明该输入的括号表达式合法。

2.如果匹配不成功,则说明输入的括号表达式不合法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值