服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言数据结构之栈与队列的相互实现

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

2023-02-21 16:39MT_125 C/C++

这篇文章主要为大家详细介绍了如何利用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://blog.csdn.net/MT_125/article/details/125593163

延伸 · 阅读

精彩推荐
  • C/C++QT实现简单打地鼠游戏

    QT实现简单打地鼠游戏

    这篇文章主要为大家详细介绍了QT实现简单打地鼠游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    一颗小小小颗粒11312021-10-15
  • C/C++C语言实现奇数阶魔方阵的方法

    C语言实现奇数阶魔方阵的方法

    这篇文章主要介绍了C语言实现奇数阶魔方阵的方法,涉及数组及相关数学函数的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    C语言教程网4452021-02-22
  • C/C++C语言汉诺塔的简单了解

    C语言汉诺塔的简单了解

    这篇文章主要给大家介绍了关于C语言汉诺塔的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    daener5832021-10-21
  • C/C++C++函数重载的深入解析

    C++函数重载的深入解析

    在C++中,我们也能够把具有相同功能的函数整合到一个函数上,而不必去写好多个函数名不同的函数,这叫做函数的重载。以下是对C++中的函数重载进行了...

    C++教程网3612020-12-20
  • C/C++C++中4种强制类型转换的区别详析

    C++中4种强制类型转换的区别详析

    这篇文章主要给大家介绍了关于C++中4种强制类型转换区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值...

    制造天堂6592021-10-26
  • C/C++C语言动态数组详解

    C语言动态数组详解

    本文给大家分享的是一则使用C语言实现动态数组的代码,完美解决内存溢出以及内存回收问题,有需要的小伙伴可以参考下...

    江锋渔火3652022-01-05
  • C/C++c++11多种格式时间转化为字符串的方法实现

    c++11多种格式时间转化为字符串的方法实现

    本文主要介绍了c++11多种格式时间转化为字符串的方法实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    帝江VII3842022-03-07
  • C/C++Linux下编译C程序的过程

    Linux下编译C程序的过程

    我们总是在Linux下输入 gcc -o app main.c 即可编译好程序,对于具体的详细过程及流程,相信亲们就不太了解啦!下面给大家展示一下C编译器的解释全过程。...

    C语言教程网3902021-03-22