栈与队列练习题

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


练习题

  • **作者前言**
  • 有效的括号
  • 用队列实现栈
  • 用栈实现队列
  • 总结

有效的括号

有效的括号
在这里插入图片描述
思路: 我们可以使用一个栈来解决这个问题, 我们用栈来存储左括号,当遇见右括号就取出栈顶元素出来比较,如果符合就继续匹配,否则就返回false, 或者最后栈还要数据,或者栈没有数据但还要右括号都是不匹配成功的

typedef char TackDataType;
typedef struct Stack
{
    TackDataType * a;
    int top; //栈顶元素
    int capacity;
}Stack;
//初始化
void TackInit(Stack *pst)
{
    assert(pst);
    pst->a = NULL;
    pst->top = -1;
    pst->capacity = 0;
}
// 入栈
void TackPush(Stack *pst, TackDataType elemest)
{
    assert(pst);
    //判断是否满了
    if ((pst->top) +1 == pst->capacity)
    {
        pst->capacity = (pst->capacity == 0? 4 : pst->capacity * 2);
        TackDataType* tmp = (TackDataType*)realloc(pst->a,sizeof(Stack) * pst->capacity);
        if (tmp == NULL)
        {
            perror("realloc");
            return;
        }
        pst->a = tmp;

    }
    pst->a[++(pst->top)] = elemest;

}
//出栈
void TackPop(Stack *pst)
{
    assert(pst);
    if(pst->top != -1)
        pst->top--;
}
//长度
int TackSize(Stack *pst)
{
    assert(pst);
    return (pst->top) + 1;
}
//是否为空
bool TackEmpty(Stack *pst)
{
    assert(pst);
    return pst->top == -1; 
}
//栈顶元素
TackDataType TackTop(Stack *pst)
{
    assert(pst);
    return pst->a[pst->top];
}
//释放
void TackDestroy(Stack *pst)
{
    free(pst->a);
    pst->a = NULL;
    pst->top = -1;
    pst ->capacity = 0;
}

bool isValid(char* s) 
{
    Stack pst;
    //初始化
    TackInit(&pst);
    while(*s)
    {
        if(*s == '{' || *s == '[' || *s == '(')
        {
            //入栈
            TackPush(&pst, *s);

        }
        else
        {
            //是否为空
            if (TackEmpty(&pst))
            {
                TackDestroy(&pst);
                return false;
            }

                
            //栈顶元素
            if ((*s == '}' &&  TackTop(&pst) == '{')
            || (*s == ']' &&  TackTop(&pst) == '[')
            ||(*s == ')' &&  TackTop(&pst) == '('))
            {
                //出栈
                TackPop(&pst);
            }
            else
            {
                return false;
            }
            

        }
        s++;
    }
    //是否为空
    if (!TackEmpty(&pst))
    {
        TackDestroy(&pst);
        return false;
    }
    TackDestroy(&pst);    
    return true;

    
}

用队列实现栈

用队列实现栈
在这里插入图片描述

这道题主要的就是在删除和插入数据中要下点功夫,
插入: 我们只需往不为空的队列插入,因为这样必定有一个队列为空,如果刚开始两个队列都为空,我们只需随意插入一个队列就行
删除: 我们删除栈的栈顶元素,是直接删除最新插入的元素,而队列的特点就是先进先出,我们可以借助空队列把非空队列的最后一个元素保留下来,然后把多余的元素插入到空队列中,需要注意的是,插入的最后一个元素的下一个next一定要修改为NULL,不然在释放会有野指针,然后保留的最后一个元素再free掉,
剩下的就是释放空间:
我们要先释放掉链表的空间,然后再释放两个队列的空间,

删除:
在这里插入图片描述

typedef int QDataType;
//链表节点
typedef struct QNode
{
    QDataType val;
    struct QNode *next;
}QNode;
//队列结构
typedef struct Queue
{
    QNode* head;
    QNode* tail; //队尾
    int size;
}Queue;


//创建两个队列
typedef struct
{
    Queue stack1;
     Queue stack2;

} MyStack;


MyStack* myStackCreate() 
{
    //创建两个队列
    MyStack * Queuetack = (MyStack*)malloc(sizeof(MyStack));
    //创建哨兵位
    Queuetack->stack1.head = (QNode*)malloc(sizeof(QNode));
    Queuetack->stack1.head->next = NULL;
    Queuetack->stack1.size = 0;
     Queuetack->stack1.tail = Queuetack->stack1.head;
      //创建哨兵位
     Queuetack->stack2.head = (QNode*)malloc(sizeof(QNode));
    Queuetack->stack2.head->next = NULL;
    Queuetack->stack2.size = 0;
     Queuetack->stack2.tail = Queuetack->stack2.head;
     return Queuetack;

    
}

void myStackPush(MyStack* obj, int x) 
{
   assert(obj);
    if (obj->stack2.size)
    {
        //创建节点
        QNode* newnode = (QNode*)malloc(sizeof(QNode));
        newnode->val = x;
        newnode->next = NULL;
        //插入
        obj->stack2.tail->next = newnode;
        obj->stack2.tail = newnode;
        obj->stack2.size++;
    }
    else
    {
        //创建节点
        QNode* newnode = (QNode*)malloc(sizeof(QNode));
        assert(newnode);
        newnode->val = x;
        newnode->next = NULL;
        //插入
        obj->stack1.tail->next = newnode;
        obj->stack1.tail = newnode;
        obj->stack1.size++;
    }
}

int myStackPop(MyStack* obj) 
{
    if (!obj->stack2.size && !obj->stack1.size)
        return 0;
    if (obj->stack2.size)
    {
        while (obj->stack2.head->next != obj->stack2.tail)
        {
            QNode* node = obj->stack2.head->next;
            obj->stack2.head->next = node->next;
            obj->stack1.tail->next = node;
            obj->stack1.tail = node;
            
            obj->stack1.size++;

        }
        obj->stack1.tail->next = NULL;
        int a = obj->stack2.tail->val;
        free(obj->stack2.tail);
        obj->stack2.tail = obj->stack2.head;
        obj->stack2.head->next = NULL;
        obj->stack2.size = 0;
        return a;
    }
    else
    {

        while (obj->stack1.head->next != obj->stack1.tail)
        {
            QNode* node = obj->stack1.head->next;
            obj->stack1.head->next = node->next;
            obj->stack2.tail->next = node;
            obj->stack2.tail = node;
            
            obj->stack2.size++;

        }
        obj->stack2.tail->next = NULL;
        int a = obj->stack1.tail->val;
        free(obj->stack1.tail);
        obj->stack1.tail = obj->stack1.head;
        obj->stack1.head->next = NULL;
        obj->stack1.size = 0;
        return a;
    }
    
}

int myStackTop(MyStack* obj) 
{

    
    if (!obj->stack2.size && !obj->stack1.size)
        return 0;
    if (!obj->stack2.size)
    {
        return obj->stack1.tail->val;
    }
    else
    {
        return obj->stack2.tail->val;
    }
}

bool myStackEmpty(MyStack* obj) 
{
    return obj->stack2.size== 0 && obj->stack1.size ==0;
}

void myStackFree(MyStack* obj) 
{
    QNode *cur = obj->stack1.head->next;
    while(cur)
    {
        QNode *cur1 = cur->next;
        free(cur);
        cur = cur1;
    }
    free(obj->stack1.head);
    obj->stack1.head = NULL;
    obj->stack1.size = 0;
    obj->stack1.tail = NULL;

    cur = obj->stack2.head->next;
     while(cur)
    {
        QNode *cur1 = cur->next;
        free(cur);
        cur = cur1;
    }
     free(obj->stack2.head);
    obj->stack2.head = NULL;
    obj->stack2.size = 0;
    obj->stack2.tail = NULL;
    free(obj);
}

用栈实现队列

在这里插入图片描述
这道题的思路和上面的题目思路是相同的,我们借助两个栈来实现队列,
有点差别就是
删除:
在这里插入图片描述
删除我们不能从top那边开始拉数据,而是要从left开始,
我们还要注意的就是队列插入的时候一定判断 栈是否要扩大空间,

typedef int StackDAtaType;
typedef struct Stack
{
    StackDAtaType *data;
    int top;//栈顶元素下一个
    int capacity;

}Stack;

typedef struct 
{
    Stack stack1;
    Stack stack2;
} MyQueue;


MyQueue* myQueueCreate() 
{
    //初始化
    MyQueue *queue = (MyQueue*)malloc(sizeof(MyQueue));
    //第一个栈
    queue->stack1.data = NULL;
    queue->stack1.top = 0;//栈顶元素的下一个
    queue->stack1.capacity = 0;
    //第二个栈
    queue->stack2.data = NULL;
    queue->stack2.top = 0;
    queue->stack2.capacity = 0;
    return queue;
}

void myQueuePush(MyQueue* obj, int x) 
{
    if(obj->stack1.top)
    {
        //第一个栈插入
        //判断是否满栈
        if(obj->stack1.top == obj->stack1.capacity)
        {
            obj->stack1.capacity = (obj->stack1.capacity == 0 ? 4 : obj->stack1.capacity * 2);
             StackDAtaType *tmp =  (StackDAtaType*)realloc(obj->stack1.data, sizeof(StackDAtaType) * obj->stack1.capacity);
             if (tmp == NULL)
             {
                 perror("realloc");
                 return ;
             }
              obj->stack1.data = tmp;
        }
        obj->stack1.data[obj->stack1.top++] = x;
    }
    else
    {
        //第二个栈插入
        //判断是否满栈
        if(obj->stack2.top == obj->stack2.capacity)
        {
            obj->stack2.capacity = (obj->stack2.capacity == 0 ? 4 : obj->stack2.capacity * 2);
             StackDAtaType *tmp =  (StackDAtaType*)realloc(obj->stack2.data, sizeof(StackDAtaType) * obj->stack2.capacity);
             if (tmp == NULL)
             {
                 perror("realloc");
                 return ;
             }
             obj->stack2.data = tmp;
        }
        obj->stack2.data[obj->stack2.top++] = x;
    }
}

int myQueuePop(MyQueue* obj)
{
    if (!obj->stack2.top && !obj->stack1.top)
        return 0;
        //判断是否满栈
    if (obj->stack1.top == obj->stack1.capacity)
    {
        obj->stack1.capacity = (obj->stack1.capacity == 0 ? 4 : obj->stack1.capacity * 2);
        StackDAtaType* tmp = (StackDAtaType*)realloc(obj->stack1.data, sizeof(StackDAtaType) * obj->stack1.capacity);
        if (tmp == NULL)
        {
            perror("realloc");
            return 0;
        }
        obj->stack1.data = tmp;
    }
    //判断是否满栈
    if (obj->stack2.top == obj->stack2.capacity)
    {
        obj->stack2.capacity = (obj->stack2.capacity == 0 ? 4 : obj->stack2.capacity * 2);
        StackDAtaType* tmp = (StackDAtaType*)realloc(obj->stack2.data, sizeof(StackDAtaType) * obj->stack2.capacity);
        if (tmp == NULL)
        {
            perror("realloc");
            return 0;
        }
        obj->stack2.data = tmp;
    }
    int a = 1;
    if (obj->stack2.top)
    {
        
        //取出第二栈的元素 插入到第一栈
        while (obj->stack2.top > a)
        {
            obj->stack1.data[obj->stack1.top] = obj->stack2.data[a++];
            obj->stack1.top++;

        }
        obj->stack2.top = 0;
        return obj->stack2.data[obj->stack2.top];
    }
    else
    {
        //取出第一栈的元素 插入到第二栈
        while (obj->stack1.top > a)
        {
  
            obj->stack2.data[obj->stack2.top++] = obj->stack1.data[a++];

        }
        obj->stack1.top = 0;
        return obj->stack1.data[obj->stack1.top];

    }

}

int myQueuePeek(MyQueue* obj) 
{
    if(!obj->stack2.top && !obj->stack1.top)
        return 0;
    if(obj->stack2.top)
    {
        return obj->stack2.data[0];
    }
    else
    {
       return obj->stack1.data[0];

    }
    
}

bool myQueueEmpty(MyQueue* obj) 
{
    return obj->stack1.top == 0 && obj->stack2.top == 0;
}

void myQueueFree(MyQueue* obj) 
{
    free(obj->stack1.data);
    obj->stack1.data = NULL;
    obj->stack1.top = 0;
    obj->stack1.capacity = 0;

    free(obj->stack2.data);
    obj->stack2.data = NULL;
    obj->stack2.top = 0;
    obj->stack2.capacity = 0;
    free(obj);

}

总结

这些题目主要还是考察我们对队列和栈的熟悉程度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/156516.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python基础入门----如何通过conda搭建Python开发环境

文章目录 使用 conda 搭建Python开发环境是非常方便的,它可以帮助你管理Python版本、依赖库、虚拟环境等。以下是一个简单的步骤,演示如何通过 conda 搭建Python开发环境: 安装conda: 如果你还没有安装 conda,首先需要安装Anaconda或Miniconda。Anaconda是一个包含很多数据…

Pytorch D2L Subplots方法对画图、图片处理

问题代码 def show_images(imgs, num_rows, num_cols, titlesNone, scale1.5): #save """绘制图像列表""" figsize (num_cols * scale, num_rows * scale) _, axes d2l.plt.subplots(num_rows, num_cols, figsizefigsize) axes axes.flatten…

全新叙事赛道:诺亚引领不良资产合成潮流,DeFi生态再添“万亿”动力

在全球DeFi领域,一场革命性的变革正在悄然兴起。诺亚项目以其独特的商业模式和前瞻性的愿景成为DeFi 2.0的一股新力量。作为全球首家专注于不良资产合成铸币的平台,诺亚项目凭借其强大的经济模型和全新的叙事赛道,正迅速崭露头角,…

用requests库下载文件时的挂起问题:一步步诊断与解决方案

在使用 requests 库下载一个大小为125KB的文件时,用户遇到了一个问题,下载进程在代码的特定行挂起了。用户已经检查了操作系统的内存,发现大约有2GB的空闲内存可用。用户正在使用 requests 库的2、28、1版本,并寻求帮助来调试这个…

【LeetCode刷题-滑动窗口】--340.至多包含K个不同字符的最长子串

340.至多包含K个不同字符的最长子串 class Solution {public int lengthOfLongestSubstringKDistinct(String s, int k) {int len s.length();if(len < k){return len;}//滑动窗口的左右指针int left 0,right 0;//定义一个哈希映射HashMap<Character,Integer> hash…

「Verilog学习笔记」用3-8译码器实现全减器

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 首先列出3-8译码器和全减器的真值表 全减器真值表如下 3-8译码器真值表如下 timescale 1ns/1nsmodule decoder_38(input E ,input A0 …

【双十二预售】9.9元就能学《人工智能导论》!打卡赢红包,还有B站大会员等你领

双十二买什么最划算&#xff1f;那当然是知识&#xff01;知识是永存的&#xff01;是无价的&#xff01; Mo 平台活动力度拉满&#xff01;&#xff01;&#xff01; 原价 199.9 元的浙江大学《人工智能导论》课程 现在只要 9.9 元&#xff01;&#xff01;&#xff01; 参…

专家呼吁:家长应承担起数字时代家庭教育新责任

在教育数字化转型的推进下,教育理念不断发生变化,学校教育不再是唯一的主角,家庭教育开始受到重视,家庭也正在逐渐成为新的学习中心。 2022年《家庭教育促进法》正式推行实施,进一步强调了家庭教育在孩子成长过程中的重要地位以及父母在孩子教育于成长过程中不可或缺的重要作用…

总结 CNN 模型:将焦点转移到基于注意力的架构

一、说明 在计算机视觉时代&#xff0c;卷积神经网络&#xff08;CNN&#xff09;几十年来一直是主导范式。直到 2021 年 Vision Transformers (ViTs) 出现&#xff0c;这个领域才开始发生变化。现在&#xff0c;是时候采用受 Transformer 架构启发的基于注意力的模型了&#x…

typeof null的结果为什么是Object?

在 JavaScript 第一个版本中&#xff0c;所有值都存储在 32 位的单元中&#xff0c;每个单元包含一个小的 类型标签(1-3 bits) 以及当前要存储值的真实数据。类型标签存储在每个单元的低位中&#xff0c;共有五种数据类型&#xff1a; 如果最低位是 1&#xff0c;则类型标签标志…

使用vs studio 2017的cl命令查看c++类的模型结构

1、定位到当前CPP文件的盘符 2、定位到cpp文件所在目录 3、输入&#xff1a; cl /d1 reportSingleClassLayout查看的类名 所属文件名 例如&#xff1a; 我的代码 //源1.cpp class Base { public:int m_A; protected:int m_B; private:int m_C; //私有成员只是被隐藏了&#x…

美国FDA宣布MoCRA法规最新指导意见

美国食品药品管理局&#xff08;FDA&#xff09;在2023年11月8日发布了最新指导意见&#xff0c;宣布将《2022年化妆品法规现代化法案》&#xff08;MoCRA&#xff09;中的化妆品“设施注册”和“产品列名”执行时间延后六个月至2024年7月1日。这一举措是FDA对行业意见的积极回…

中级程序员——vue3+js+git面试题

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;vue3jsgit面试题 文章目录 vue3最大缺点和优点&#xff1f;vue3组合式里面&#xff0c;如何去调用子组件里面的方法&#xff1f;watch和watcheffect有什么区别&#xff1f;计算属性和watch的区别是什…

vue3+ts扩展全局属性

在使用vue3 ts配置全局变量&#xff0c;需要添加一下扩展 文档 https://cn.vuejs.org/guide/reusability/plugins.html

OSPF开放最短路径优先(Open Shortest Path First)协议

OSPF开放最短路径优先(Open Shortest Path First)协议 为克服RIP的缺点(限制网络规模&#xff0c;坏消息传得慢)在1989年开发出来的原理很简单&#xff0c;但实现很复杂使用了Dijkstra提出的最短路径算法SPF(Shortest Path First)采用分布式的链路状态协议(link state protoco…

新的 Reptar CPU 缺陷影响英特尔台式机和服务器系统

英特尔修复了其现代台式机、服务器、移动和嵌入式 CPU 中的一个高严重性 CPU 漏洞&#xff0c;包括最新的 Alder Lake、Raptor Lake 和 Sapphire Rapids 微架构。 攻击者可以利用该缺陷&#xff08;追踪为CVE-2023-23583并被描述为“冗余前缀问题”&#xff09;来升级权限、获…

开源网安解决方案荣获四川数实融合创新实践优秀案例

​11月16日&#xff0c;2023天府数字经济峰会在成都圆满举行。本次峰会由四川省发展和改革委员会、中共四川省委网络安全和信息化委员会办公室、四川省经济和信息化厅等部门联合指导&#xff0c;聚焦数字经济与实体经济深度融合、数字赋能经济社会转型发展等话题展开交流研讨。…

这次轮到微软炸场了;5000+AI工具调研报告 (500万字);狂打一星开喷AI聊天机器人;CMU LLM课程;AI创业的方向与时机 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f251; Microsoft Ignite 2023 技术大会&#xff1a;微软的年度炸场时刻&#xff0c;而且连炸四天 https://ignite.microsoft.com OpenAI 开发…

WebGoat通关攻略之 SQL Injection (intro)

SQL Injection (intro) 1. What is SQL? 本题练习SQL查询语句&#xff0c;就是写一句SQL获取叫Bob Franco所在的department SELECT department FROM employees WHERE first_name Bob AND last_name Franco成功通关&#xff01; 2. Data Manipulation Language (DML) 本题…

畅捷通+数环通iPaaS,实现无代码集成上千款应用

01 关于畅捷通 畅捷通信息化服务专家,为用户提供在线财务软件,云进销存管理软件,移动办公软件,帮助小微企业人、财、货、客的管理,全面服务小微企业并提供社交化、个性化、服务化、小量化的生意管理支持。 企业除了畅捷通&#xff0c;还有大大小小其他的系统&#xff0c;面临着…