栈与队列练习题

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者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.hqwc.cn/news/186212.html

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

相关文章

购买阿里云服务器需要多少钱?活动价3000元-5000元的阿里云服务器汇总

购买阿里云服务器需要多少钱?如果我们只有3000元-5000元的预算可以购买什么实例规格和配置的阿里云服务器呢?因为阿里云服务器价格是由实例规格、配置、带宽等众多配置决定的,所以,目前阿里云活动中的价格在3000元-5000元的云服务…

redis常见问题及解决方案

缓存预热 定义 缓存预热是一种优化方案,它可以提高用户的使用体验。 缓存预热是指在系统启动的时候,先把查询结果预存到缓存中,以便用户后面查询时可以直接从缓存中读取,节省用户等待时间 实现思路 把需要缓存的方法写在初始化方…

在计算机领域如神一般存在的人都有哪些?

✍️作者简介:沫小北/码农小北(专注于Android、Web、TCP/IP等技术方向) 🐳博客主页:沫小北/码农小北 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN 🔔如果文章对您有一定的帮助请&…

AD教程 (十七)3D模型的创建和导入

AD教程 (十七)3D模型的创建和导入 对于设计者来讲,现在3DPCB比较流行,3DPCB,除了美观之外,做3D的最终的一个目的,是为了去核对结构,就是我们去做了这么一个PCB之后,如果说…

筋膜炎怎么治疗才能除根

筋膜炎的引起原因,常见的有以下几种: 1.职业因素。经常牵拉某些肌肉容易导致肌肉出现劳损,如司机、教师、运动员等,发生筋膜炎的几率会明显比正常人要高。 2.疾病因素。例如扁平足、糖尿病的人群,发生足底筋膜炎的几…

PON网络应用场景

PON网络主要应用在两个场景: 1.电信运营商FTTx FTTx解决方案覆盖FTTH、FTTB、FTTC、FTTO等建设场景,还能提供基站专线接入在内的高带宽、高可靠、高安全的全业务接入。 提供主要业务包括:50MHDTV业务、企业接入业务、Open Access接入、基站专…

JSON 格式的接口测试流程【Eolink Apikit】

在进行JSON格式的接口测试时,需要使用工具发送HTTP请求并获取响应。测试工具可以是单独的测试框架,如 Eolink Apikit。测试人员需要根据接口文档和测试用例编写测试脚本,然后运行测试并分析结果,以确保接口的质量和稳定性。 当我…

解决java在idea运行正常,但是打成jar包后中文乱码问题

目录 比如: 打包命令使用utf-8编码: 1.当在idea中编写的程序,运行一切正常.但是当被打成jar包时,执行的程序会中文乱码.产生问题的原因和解决方案是什么呢? 一.问题分析 分别使用idea和jar包形式打印出System中所有的jvm参数---代码如下: public static…

Linux - 用户级缓冲区和系统缓冲区 - 初步理解Linux当中文件系统

前言 文件系统 我们先来看两个例子: 这个程序输出: 此时的输出也满足的我们预期。 我们也可以把 程序执行结果,输出重定向到 一个文件当中: 当我们在代码的结尾处,创建了子进程,那么输出应该还是和上述是一样的&…

K8s 命令行

前言:关于k8s 与 docker Docker和Kubernetes(通常简称为K8s)是两个在容器化应用程序方面非常流行的开源工具。 Docker: Docker 是一种轻量级的容器化平台,允许开发者将应用程序及其所有依赖项打包到一个称为容器的可移植容器中…

三成青少年“不能忍受没有手机”?数字时代家庭教育新责任考验家长

孩子放学回家第一件事就是刷手机,不仅耽误睡觉而且严重影响学习,没收手机后孩子哭闹不止,更无心学习,这样的熊孩子你遇到过没?近日,福建一家长在社区群里晒出自己的烦恼,结果骤然成为热帖,不少…

openssl1.0.2版本Windows安装问题

之前安装过1.1版本,Windows环境下C 安装OpenSSL库 源码编译及使用(VS2019)_vs2019安装openssl_肥宝Fable的博客-CSDN博客 后来发现linux编译不过,以为是版本问题,相差太大,所以降一下版本,以免…