栈与队列练习题

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者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);}

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud-Gateway修改Response响应体,并解决大数据量返回不全等问题

官网相关案例: Spring Cloud Gatewayhttps://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-modifyresponsebody-gatewayfilter-factory ModifyRequestBodyGatewayFilterFactory类: https://github.com/spring-cloud/spring-cloud-gate…

高防IP可以抵御哪些恶意攻击

高防IP协议可以隐藏用户的站点,使得攻击者无法发现恶意攻击的目标网络资源,从而提高了源站的安全性。能够有效抵御常见的恶意攻击类型ICMPFlood、UDPFlood、 TCPFlood、SYNFlood、ACKFlood等,帮助游戏、金 融、电子商务、互联网、政企等行业抵…

Unity中Shader矩阵的乘法

文章目录 前言一、矩阵乘以标量二、矩阵和矩阵相乘1、第一个矩阵的列数必须 与 第二个矩阵的行数相等,否则无法相乘!2、相乘的结果矩阵,行数由第一个矩阵的行数决定,列数由第二个矩阵的列数决定! 三、单位矩阵四、矩阵…

设计模式-适配器-笔记

适配器模式Adapter 动机(Motivation) 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是在这些现存对象所不满足的。 如何应对这种“迁移的变化”&#xff1…

互联网Java工程师面试题·微服务篇·第一弹

目录 ​编辑 1、您对微服务有何了解? 2、微服务架构有哪些优势? 3、微服务有哪些特点? 4、设计微服务的最佳实践是什么? 5、微服务架构如何运作? 6、微服务架构的优缺点是什么? 7、单片&#xff0c…

LMI相机配置步骤,使用Gocator2550相机

在此之前可以先浏览我编写的相机SDK通用类和LMISDK,进行配套观看 https://blog.csdn.net/m0_51559565/article/details/134404394 //LMI相机SDK https://blog.csdn.net/m0_51559565/article/details/134403745 //相机通用类1.启动LMI加速器 LMI加速器用于将相机…

零代码编程:用ChatGPT批量转换多个视频文件夹到音频并自动移动文件夹

有很多个视频文件夹: 要全部转成音频,然后复制到另一个文件夹。 在ChatGPT中输入如下提示词: 你是一个Python编程专家,要完成一个批量将Mp4视频转为Mp3音频的任务,具体步骤如下: 打开文件夹:…

基于JavaWeb+SpringBoot+Vue电子商城微信小程序系统的设计和实现

基于JavaWebSpringBootVue电子商城微信小程序系统的设计和实现 源码获取入口前言系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 身处互联网时代,互联网无形中影响着人们的吃穿住行,人们享受着不…

uart控制led与beep

仲裁模块代码: // 外设控制模块,根据uart接收到的数据,控制led与beep的标志信号。 module arbit(input wire sys_clk ,input wire sys_rst_n ,input wire pi_flag …

微软Surface/Surface pro笔记本电脑进入bios界面

微软Surface笔记本电脑进入bios界面 方法一推薦這種方法:Surface laptop 进BIOS步骤 开机后,不停按音量键进bios界面。 方法二:Surface Book、Surface Pro进bios步骤 1、关闭Surface,然后等待大约10秒钟以确保其处于关闭状态。…

C++之list

C之list list的构造 #include <iostream> #include<list> using namespace std;//打印函数 void printfList(const list<int>&L) {for(list<int>::const_iterator it L.begin();it ! L.end();it){cout<<*it<<" ";}cout<…

redis运维(十)列表

一 列表 强调&#xff1a; 知道原生redis具备的能力,以便后续API调用 ① 基础概念 备注&#xff1a; 单个list最多2^32-1个元素 列表操作常用命令,涉及&#xff1a;CURD ② lpush 左插入 说明&#xff1a; 如果key不存在就会初始化,否则就是插入元素备注&#xff1a; l…

腾讯云服务器新用户专享优惠券,腾讯云新用户代金券领取入口汇总

什么是腾讯云新用户专享优惠券&#xff1f; 腾讯云新用户专享优惠券是腾讯云为新用户提供的一种特别优惠。你可以在购买腾讯云服务器时使用这些优惠券&#xff0c;以更低的价格获得优质的云服务。 为了回馈广大新用户&#xff0c;腾讯云服务器推出了一系列优惠活动&#xff0…

sql注入 [极客大挑战 2019]LoveSQL 1

打开题目 几次尝试&#xff0c;发现输1 1"&#xff0c;页面都会回显NO,Wrong username password&#xff01;&#xff01;&#xff01; 只有输入1&#xff0c;页面报错&#xff0c;说明是单引号的字符型注入 那我们万能密码试试能不能登录 1 or 11 # 成功登录 得到账号…

Stable Diffusion WebUI使用AnimateDiff插件生成动画

AnimateDiff 可以针对各个模型生成的图片&#xff0c;一键生成对应的动图。 配置要求 GPU显存建议12G以上&#xff0c;在xformers或者sdp优化下显存要求至少6G以上。 要开启sdp优化&#xff0c;在启动参数加上--sdp-no-mem-attention 实际的显存使用量取决于图像大小&#…

Linux安装RabbitMQ详细教程

一、下载安装包 下载erlang-21.3-1.el7.x86_64.rpm、rabbitmq-server-3.8.8-1.el7.noarch.rpm 二、安装过程 1、解压erlang-21.3-1.el7.x86_64.rpm rpm -ivh erlang-21.3-1.el7.x86_64.rpm2、安装erlang yum install -y erlang3、查看erlang版本号 erl -v4、安装socat …

设计模式解码:软件工程架构的航标

引言 软件工程领域的设计模式&#xff0c;就像是建筑师手中的设计蓝图&#xff0c;它们是经验的总结&#xff0c;指导开发者如何在面对层出不穷的编程难题时&#xff0c;构建出既稳固又灵活的软件结构。就像一座经过精心设计的大厦能够经受住风雨的考验一样&#xff0c;一个利用…

云计算和跨境电商:数字化未来的基石

云计算和跨境电商两者结合&#xff0c;共同塑造着当今数字化时代的商业未来。这两个领域的发展&#xff0c;为企业提供了前所未有的机会&#xff0c;使他们能够扩展国际业务、提高效率&#xff0c;以及为全球市场提供更多产品和服务。本文将深入探讨云计算如何成为跨境电商的数…

汽车 CAN\CANFD数据记录仪

CAN FD数据记录仪解决汽车电子数据记录与偶发性故障查找问题。 1、脱机离线记录两路CAN/CANFD通道数据 脱机离线记录两路CAN/CANFD通道数据&#xff0c;可记录6个月数据。每个通 道单独设置触发记录模式、触发前预记录报文个数&#xff08;默认1000帧&#xff09;及 过滤规则&a…

基于单片机的自动变速箱电控系统

**单片机设计介绍&#xff0c; 基于单片机的自动变速箱电控系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的自动变速箱电控系统是一种通过单片机来控制车辆自动变速箱的系统。它借助传感器和单片机的协同工作&am…