C语言数据结构之栈与队列怎么相互实现

一、用对列实现栈

题干要求:

C语言数据结构之栈与队列怎么相互实现

细节分析:队列是先进先出; 要实现的栈是先进后出。

解题思路:假设:先用一个队列储存数据 N 个,然后将前 N-1 个数据导入到另一个队列,

此时,原始队列中仅剩一个,是最后剩的数据,便可将其导出,这便是一次后进先出。

细节点:每次导出数据时,都需要一个队列向另一个队列传入数据,因此输入队列和输出队列 需要轮换,要对其进行判定。

具体过程gif动态图如下:

C语言数据结构之栈与队列怎么相互实现

代码实现

1.初始化栈:先初始化两个队列

//栈的结构是由两个队列构成typedef struct Nystack{   Quetail q1;   Quetail q2;} MyStack; //栈的初始化MyStack* myStackCreate() {   MyStack* Newstack = (MyStack*)malloc(sizeof(MyStack));   Que_Init(&Newstack->q1);   Que_Init(&Newstack->q2);   return Newstack;}

2. 插入数据

因为存储数据的队列不是固定的,因此在一个队列有数据的前提下,就继续向该队列插入数据,

空的队列负责在导出数据时进行轮转。(哪个不空向哪个插入)

//插入数据void myStackPush(MyStack* obj, int x) {     //if((&obj->q1)->head == NULL) //法一:直接判断是否为空     if(Que_Empty(&obj->q1))        //法二:后续函数的复用     Que_push(&obj->q2,x);     else     Que_push(&obj->q1,x);}

3.导出数据(实现先进后出)

C语言数据结构之栈与队列怎么相互实现

名列前茅步:将有数据的队列中除最后进的数据,依次导入到另一个空队列 ;

导入空队列,删除原队列,保留最后数据。

第二布:将原队列中最后一个数据导出 。

注:这里先假设了两个队列中,一个是原队列和一个是空队列,再进行判定,若与实际不符,则 交换 。

int myStackPop(MyStack* obj) {    int temp = 0;    //假设原队列和空队列    Quetail* existque = &obj->q1,*nullque = &obj->q2;    if((&obj->q1)->head == NULL)      //判断与实际是否相符    {        existque = nullque;        nullque = &obj->q1;    }     for(;existque->head->Next;)       //保留最后一个数据    {        Que_push(nullque,existque->head->data);  //向空队列导入数据          Que_pop(existque);                       //删除原队列数据    }    temp = existque->head->data;          Que_pop(existque);                //导出最后进的数据    return temp;}

4.查找栈顶数据

找到不空的队列 >> 返回其队尾的数据

int myStackTop(MyStack* obj) {    if((&obj->q1)->head == NULL)    {        return (&obj->q2)->tail->data;    }    return (&obj->q1)->tail->data;}

5.判断栈是否为空:

判断两个队列是否均为空

bool myStackEmpty(MyStack* obj) {    assert(obj);    //法一:直接判断    //if((&obj->q1)->head == NULL&& (&obj->q2)->head == NULL)    //法二:复用队列判空函数    if(Que_Empty(&(obj->q1))&&Que_Empty(&(obj->q2)))    return true;    return false;}

6.销毁栈:

销毁两个队列

void myStackFree(MyStack* obj) {     Que_Destory(&obj->q1);     Que_Destory(&obj->q2);     free(obj);}

二、用栈实现队列

题干要求:

C语言数据结构之栈与队列怎么相互实现

细节分析:这次是用两个栈,实现先进先出 。

解题思路:首先,将两个栈分为入口栈和出口栈,

其次,数据正序入口栈,由于栈是先进后出,因此将数据再逆序进入出口栈,

然后,此时数据再出口栈中是逆序,所以,便可以正序从出口栈中依次排出 。

C语言数据结构之栈与队列怎么相互实现

代码实现

1.初始化双栈队列

typedef struct {    Stack T1;    Stack T2;} MyQueue;  MyQueue* myQueueCreate() {      MyQueue *Q1;      Q1 = (MyQueue*)malloc(sizeof(MyQueue));      Stack_init(&(Q1->T1));      // T1 做入口栈      Stack_init(&(Q1->T2));      // T2 做出口栈      return Q1;}

2.插入数据

void myQueuePush(MyQueue* obj, int x) {     Stack_push(&obj->T1,x);          //这里将栈 T1 作为入口栈}

3.删除数据(先进先出)

将入口栈数据记录 >> 删除入口栈数据 >> 导入出口栈 >> 从出口栈导出数据

C语言数据结构之栈与队列怎么相互实现

int myQueuePop(MyQueue* obj) {    if(Stack_Empty(&obj->T2))          //判断是否为空    {        int k = 0;        for(;!Stack_Empty(&obj->T1);)          {            k = Stack_Top(&obj->T1);   //记录入口站数据            Stack_pop(&obj->T1);       //删除入口栈数据            Stack_push(&obj->T2,k);    //导入出口栈        }    }    int temp = 0;    temp = Stack_Top(&obj->T2);            Stack_pop(&obj->T2);               //从出口栈导出数据    return temp;                       //题干要求返回导出的值}

4.查找队列头部数据

这里的头部数据是正序的头数据,因此要先将入口栈中的逆序数据导入出口栈,

变成正序,再返回出口栈的栈顶数据 。

int myQueuePeek(MyQueue* obj) {    if(Stack_Empty(&obj->T2))         //判断出口栈中是否有数据    {        int k = 0;        for(;!Stack_Empty(&obj->T1);) //向出口栈导入数据        {            k = Stack_Top(&obj->T1);            Stack_pop(&obj->T1);            Stack_push(&obj->T2,k);        }    }    return Stack_Top(&obj->T2);       //返回出口栈栈顶数据}

5.判断队列是否为空 及 销毁队列

//判断队列是否为空bool myQueueEmpty(MyQueue* obj) {     //判断两个栈是否均为空     return Stack_Empty(&obj->T1)&&Stack_Empty(&obj->T2);} //销毁释放队列void myQueueFree(MyQueue* obj) {     Stack_pop(&obj->T1);     Stack_pop(&obj->T2);     free(obj);}

“C语言数据结构之栈与队列怎么相互实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

文章标题:C语言数据结构之栈与队列怎么相互实现,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/28441

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月21日 下午11:04
下一篇 2022年9月21日 下午11:05

相关推荐

  • MySQL约束知识点实例分析

    1. 约束(constraint)概述 1.1 为什么需要约束 — 为了保证数据的完整性 数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中 存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错…

    2022年9月15日
    77900
  • 使用ZoomEye寻找APT攻击的示例分析

    ZoomEye线上的数据是覆盖更新的模式,也就是说第2次扫描如果没有扫描到数据就不会覆盖更新数据,ZoomEye上的数据会保留第1次扫描获取到的banner数据,这个机制在这种恶意攻击溯源里其实有着很好的场景契合点:恶意攻击比如Botnet、APT等攻击使用的下载服务器被发现后一般都是直接停用抛弃,…

    2022年9月2日
    53300
  • java IP归属地功能如何实现

    名列前茅步:如何拿到用户的真实IP 大家都知道,我们一般想访问公网,一般必须具备上网环境,那么我们开通宽带之后,运营商会给我们分配一个IP地址。一般IP地址我们都是自动分配的。所以我们不知道本机地址是什么?想知道自己的ip公网地址,可以通过百度搜索IP查看自己的ip位置 那么问题来了。百度是怎么知道…

    2022年9月6日
    71400
  • windows notion中文版怎么设置

    notion变成中文版的方法 一、桌面版: 1、首先我们要下载一个汉化文件。 2、然后在其中下载“notion-zh_CN.js”这个文件。 3、下载完成后,我们找到“notion”软件,打开文件所在的位置。 4、进入后,打开“resources”文件夹。 5、接着依次进入“app”和“render…

    2022年9月20日
    1.4K00
  • php进程通信之信号量的用途是什么

    常见进程通信方式 一些理论基础 临界资源:每次仅允许一个进程访问的资源。 临界区:每个进程中访问临界资源的那段代码叫临界区 所谓临界区(也称为临界段)就是访问和操作共享数据的代码段。 进程互斥:两个或以上的进程不能同时进入关于同一组共享变量的临界区域,即一个进程正在访问临界资源,另一个进程要想访问必…

    2022年9月2日
    52900
  • windows edge浏览器广告如何关闭

    edge浏览器广告关闭方法: 1、打开浏览器,点击右上角的三个点选择“设置”。 2、点击左侧高级设置在右侧“网站设置”中关闭“使用Adobe flash player”(这会导致浏览器无法打开视频和小游戏,解决方法在下面)。 3、点击浏览器右上角的三个点,在“更多工具”选择“使用 Internet …

    2022年9月8日
    69600
  • windows谷歌浏览器缓存位置在哪

    谷歌浏览器缓存在哪: 1、打开谷歌浏览器在搜索栏输入“Chrome:Version”查看保存文件的位置。 2、随后在我的电脑中找到路径: C:UsersAdministratorAppDataLocalGoogleChromeUser DataDefault。 谷歌浏览器更改位置教程: 1、浏览器默…

    2022年9月8日
    89700
  • 如何解析Apache漏洞复现

    apache解析漏洞 漏洞原理 Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如 test.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把wooyun.php.owf.rar解析成php…

    2022年9月8日
    66500
  • 如何进行Apache Solr JMX服务RCE漏洞复现

    0x00简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。 该漏洞源于默认配置文件solr.in.s…

    2022年9月13日
    57300
  • potplayer播放视频没有声音如何解决

    potplayer播放视频没有声音的详细教程解决方法: 1、打开potplayer安装程序,然后选择【简体中文】,点击【OK】。 2、然后就是点击【下一步】,点击【我接受】。 3、在组件界面中,在【关联】下面,勾选上【关联所有格式】,其它的就随便了,然后点击【下一步】。 4、然后选择好位置以后,点击…

    2022年9月1日
    2.2K00
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部