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

相关推荐

  • excel下拉列表怎么填充颜色

    excel下拉列表填充颜色的方法: 1、首先打开软件,然后点击“数据有效性”选择“数据有校性”。 2、之后在允许中选择“序列”并输入下拉值,在依次选择“条件格式—>等于”。 3、在设置格式的值中输入对应的值,选择右侧的下拉,点击“自定义格式”。 4、之后在字体任务选择栏右下方选择颜色。 5、最…

    2022年8月27日
    57600
  • MySQL学习之日期函数怎么使用

    获取 系统时间 函数 “NOW()” 函数 能够获得当前系统日期和时间,格式如下:“YYYY-MM-DD hh:mm:ss” (这里的小时单位是 24 小时制) “CURDATE()” 函数 能够获取到当前系统的日期,格式如下:“YYYY-MM-DD” “CURTIME()” 函数 能够获得当前系统…

    2022年9月2日
    11500
  • MySQL触发器怎么创建和使用

    在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关联的表,如 商品信息 和 库存信息 分 别存放在 2 个不同的数据表中,我们在添加一条新商品记录的时候,为了保证数据的完整性,必须同时 在库存表中添加一条库存记录。 这样一来,我们就必须把这两个关联的操作步骤写到程序里面,而且要用 事务…

    2022年9月1日
    20200
  • 如何查询mysql中所有表

    查询mysql数据库中所有表的方法:1、执行“mysql -u root -p”命令并输入密码来登录mysql数据库服务器;2、执行“USE 数据库名;”命令来切换到指定数据库;3、执行“show tables;”或“SHOW FULL TABLES;”命令,会以表格形式列出mysql数据库中的所有…

    2022年9月22日
    57400
  • 如何进行Apache HTTP组件提权漏洞利用过程深度分析

    Apache HTTP 被发现存在本地提权漏洞(CVE-2019-0211),漏洞作者在第一时间就给出了WriteUp和漏洞EXP,阿尔法实验室也对EXP进行了深入分析,在此将分析的笔记整理分享出来,希望对大家理解该漏洞有所帮助。下面内容主要按着EXP的执行步骤一步步讲解,同时详细解释了利用过程中几…

    2022年9月15日
    13900
  • 禁止SpringBoot在项目中使用Tomcat容器的原理是什么

    SpringBoot中的Tomcat容器 SpringBoot可以说是目前最火的Java Web框架了。它将开发者从繁重的xml解救了出来,让开发者在几分钟内就可以创建一个完整的Web服务,极大的提高了开发者的工作效率。Web容器技术是Web项目必不可少的组成部分,因为任Web项目都要借助容器技术来…

    2022年9月19日
    9800
  • 怎么用Vue+java实现时间段的搜索

    实现效果如图: 标红的是需要注意的地方!Vue操作:1,如图: 2,如图:(数据初始化) 2.0初始化今天的日期和时间的样式: 2.1今天的日期: // 时间范围–start// daterangeLastInTime: [],// daterangeLastInTime: [n…

    2022年9月19日
    10300
  • windows浩辰cad看图王可以画图吗

    浩辰cad看图王可以画图吗 答:浩辰cad看图王有简单的画图功能。 1、浩辰cad看图王主要还是用来看图的,无法用它代替autocad来画图。 2、不过其中有一些简单的画图功能。 3、在绘图工具下,可以在图纸中添加直线、文字、圆形、矩形等图形。 4、还可以添加线性、对齐、角度、坐标、直径、半径等数据…

    2022年9月21日
    5100
  • 如何利用SAP ASE安全漏洞入侵数据库服务器

    SAP公司的Sybase数据库软件中存在一系列新的严重漏洞,没有权限的攻击者可利用这些漏洞完全控制目标数据库,在某些场景中,甚至可完全控制底层操作系统。 网络安全公司Trustware发现的这六个安全漏洞存在于Sybase Adaptive Server Enterprise(ASE)中,Sybas…

    2022年9月16日
    10400
  • windows 0x00000be蓝屏代码怎么解决

    解决方法: 方法一: 1、我们可以先看看能不能进入安全模式。 2、重启电脑,按住“F8”进入启动界面,选择“安全模式” 3、如果我们能进入安全模式,就进入“应用”程序,将最近安装的软件卸载。 4、如果我们有安装驱动程序,还需要进入设备管理器,将最新安装的驱动卸载。 5、卸载完成后,再使用杀毒软件扫描…

    2022年9月15日
    16300
联系我们
站长微信
站长微信
分享本页
返回顶部