实践出真知——深入了解栈与队列

本文通过四个实例深入探讨栈与队列,包括括号匹配问题、用队列实现栈、用栈实现队列及设计循环队列。通过C语言实现,强调实践操作以加深理解。
摘要由CSDN通过智能技术生成

前言

实践出真知,为进一步深入理解栈与队列,博主准备了四道例题来巩固栈与队列的知识,毕竟纸上得来终觉浅,实践是验证真理的唯一途径嘛,也是验证你学习成果的时候。

题目

序号 题目 链接
1 括号匹配问题 LeetCode
2 用队列实现栈 LeetCode
3 用栈实现队列 LeetCode
4 设计循环队列 LeetCode

括号匹配问题

在这里插入图片描述
这个题目比较有意思的点在于可以用栈的方式进行实现,但是由于博主目前学习的数据结构主要是由c语言进行编写,所以在使用栈的时候需要引入栈的相关函数和一些结构体的定义,具体内容在博主的上一篇有写到,点击这里

题目的具体思路比较简单,将左括号放入堆栈,同时进行字符指针s++,如果遇到右括号则与栈顶的括号进行比较,如果不匹配,则为false,如果匹配则左括号出栈,接着重复步骤继续运行直至*s == '\0’时停止循环,如下:

在这里插入图片描述
循环结束后,返回true,另外我们需要考虑字符串里的两种情况:

① “}}”:这种情况进入循环体的时候,栈为空,无法执行StackPush命令,所以进入循环体的时候需要使用StackEmpty函数来判断是否栈为空。

②"{ {":这种情况会导致出循环体的时候,栈不为空,所以直接返回true是错误的,出循环体的时候我们需要用if条件语句来判断*s是否为‘\0’,然后在使用StackEmpty函数即可。

代码如下:

bool isValid(char * s){
   
    Stack st;
    StackInit(&st);
    bool ret;
    while(*s != '\0')
    {
   
        if(*s == '[' || *s == '{' || *s == '(')
        {
   
            StackPush(&st, *s);
            s++;
        }
        else
        {
   
            if(StackEmpty(&st))
            {
   
                ret = false;
                break;
            }

            if(StackTop(&st) != '[' && *s == ']')
            {
   
                ret = false;
                break;
            }

            if(StackTop(&st) != '(' && *s == ')')
            {
   
                ret = false;
                break;
            }

            if(StackTop(&st) != '{' && *s == '}')
            {
   
                ret = false;
                break;
            }
            s++;
            StackPop(&st);
        }

    }
    if(*s 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值