广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言数据结构之栈与队列的相互实现
  • 184
分享到

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

2024-04-02 19:04:59 184人浏览 独家记忆
摘要

目录一、用对列实现栈代码实现二、用栈实现队列代码实现一、用对列实现栈 题干要求: 细节分析:队列是先进先出; 要实现的栈是先进后出。 解题思路:假设:先用一个队列储存数据 N 个,

一、用对列实现栈

题干要求:

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

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

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

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

具体过程gif动态图如下:

代码实现

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.导出数据(实现先进后出)

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

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

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

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

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);
}

二、用栈实现队列

题干要求: 

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

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

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

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

代码实现

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.删除数据(先进先出)

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

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语言 栈 队列的资料请关注编程网其它相关文章!

--结束END--

本文标题: C语言数据结构之栈与队列的相互实现

本文链接: https://www.lsjlt.com/news/153450.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言数据结构之栈与队列的相互实现
    目录一、用对列实现栈代码实现二、用栈实现队列代码实现一、用对列实现栈 题干要求: 细节分析:队列是先进先出; 要实现的栈是先进后出。 解题思路:假设:先用一个队列储存数据 N 个,...
    99+
    2022-11-13
  • C语言数据结构之栈与队列怎么相互实现
    本篇内容介绍了“C语言数据结构之栈与队列怎么相互实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、用对列实现栈题干要求:细节分析:队列是...
    99+
    2023-07-02
  • C语言栈与队列相互实现详解
    目录一、本章重点二、队列实现栈三、栈实现队列四、解题思路总结一、本章重点 用两个队列实现栈用两个栈实现队列解题思路总结 二、队列实现栈  我们有两个队列:  ...
    99+
    2022-11-13
  • C语言栈与队列怎么相互实现
    本篇内容介绍了“C语言栈与队列怎么相互实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、本章重点用两个队列实现栈用两个栈实现队列解题思路...
    99+
    2023-06-29
  • C语言数据结构进阶之栈和队列的实现
    目录栈的实现:一、栈的概念和性质二、栈的实现思路三、栈的相关变量内存布局图四、栈的初始化和销毁五、栈的接口实现:1.入栈2.出栈3.获取栈顶的数据4.获取栈的元素个数5.判断栈是否为...
    99+
    2022-11-12
  • C语言数据结构之队列的定义与实现
    目录一、队列的性质二、队列的结构三、代码实现头文件功能函数一、队列的性质 上次我们学习栈,了解到栈储存释放数据的方式是:先进后出 而队列与其相反,队列是:先进先出,后进后出。 二、队...
    99+
    2022-11-13
  • c语言数据结构之栈和队列详解(Stack&Queue)
    目录简介栈一、栈的基本概念1、栈的定义2、栈的常见基本操作二、栈的顺序存储结构1、栈的顺序存储2、顺序栈的基本算法3、共享栈(两栈共享空间)三、栈的链式存储结构1、链栈2、链栈的基本...
    99+
    2022-11-13
  • C利用语言实现数据结构之队列
    目录一、链队列二、链队的表示三、链队的基本操作1. 链队的初始化2. 链队的销毁3. 入队4. 出队四、顺序队列五、循环队列1. 初始化2. 求队列长度3. 入队4. 出队 前言: ...
    99+
    2022-11-12
  • C语言编程数据结构的栈和队列
    目录栈数组实现标题全部代码Stack_array.cStack_array.h初始化数组栈满栈后扩容是否为空栈压栈和退栈链表实现stack_chain.hstack_chain.c整...
    99+
    2022-11-12
  • C语言数据结构之队列怎么定义与实现
    今天小编给大家分享一下C语言数据结构之队列怎么定义与实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、队列的性质上次我们...
    99+
    2023-07-02
  • C语言数据结构与算法之队列的实现详解
    目录队列的概念及结构队列的实现Queue.hQueue.cTest.c队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FI...
    99+
    2022-11-13
    C语言数据结构 队列 C语言 队列实现 C语言 队列
  • C++数据结构的栈与队列实例分析
    今天小编给大家分享一下C++数据结构的栈与队列实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 栈1.1 栈的概念...
    99+
    2023-06-30
  • C语言数据结构不挂科指南之栈&队列&数组详解
    目录学习目标栈基本概念栈的基本运算栈的顺序实现双栈栈的链接实现考试要点小结学习目标 自考重点、期末考试必过指南,这篇文章让你理解什么是栈、什么是队列、什么是数组 掌握栈、队列的顺序存...
    99+
    2022-11-13
  • Java数据结构之栈与队列实例详解
    目录一,栈1,概念2,栈的操作3,栈的实现 4,实现mystack二,队列1,概念 2,队列的实现 3,实现myqueue栈、队列与数组的区别?总结 一,栈 1,概念 在我们软件应用...
    99+
    2022-11-12
  • C语言数据结构之队列算法详解
    目录一、前言二、基本概念三、顺序队列四、链队列五、循环队列六、总结与提高一、前言 队列在程序设计中经常出现,如:操作系统中的排队问题。 这篇文章主要介绍了队列的...
    99+
    2022-11-12
  • Javascript数据结构之栈和队列怎么实现
    本篇内容主要讲解“Javascript数据结构之栈和队列怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Javascript数据结构之栈和队列怎么实现”吧!栈(stack)栈是一种具有 「...
    99+
    2023-06-30
  • C语言数据结构之链队列的基本操作
    目录1.队列的定义2.队列的表示和实现(1)初始化操作(2)销毁队列(3)入队操作(4)出队操作附录完整代码:总结1.队列的定义 队列 (Queue)是另一种限定性的线性表,它只允许...
    99+
    2022-11-12
  • C语言编程数据结构栈与队列的全面讲解示例教程
    目录一、栈的表示和实现1栈的概念和结构2栈的初始化3压栈(栈顶插入一个数据)4出栈(栈顶删除一个数据)5取栈顶元素6取栈顶元素7判断栈是否为空二、队列的表示和实现1队列的概念及结构2...
    99+
    2022-11-12
  • C#数据结构与队列怎么实现
    这篇文章主要讲解了“C#数据结构与队列怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#数据结构与队列怎么实现”吧!C#数据结构与算法之队列是一种特殊的线性表,它只允许在表的前端(f...
    99+
    2023-06-18
  • Python数据结构之栈、队列的实现代码分享
    1. 栈 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放...
    99+
    2022-06-04
    数据结构 队列 代码
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作