数据结构学习系列之用队列实现栈功能与用栈实现队列功能

  • 队列与栈:
  • 队列(Queue)是一种先进先出(FIFO)的线性表;
  • 栈(Stack)是一种后进先出(LIFO)的线性表;
  • 实例1:
  • 用队列实现栈的功能;
  • 算法思想:
  • 若实现一个栈的功能,需要用到两个队列来实现此功能,创建两个队列Q1和Q2;
  • 入栈:
  • 1.先判断Q1是否为空;
  • 2.若Q1为空,则数据元素依次入队到Q1,而Q2的数据元素依次出队,并入队到Q1,即数据元素在Q1完成入栈;
  • 3.若Q1为不为空,则数据元素依次入队到Q2,而Q1的数据元素依次出队,并入队到Q2,即数据元素在Q2完成入栈;
  • 出栈:
  • 1.判断Q1是否为空;
  • 2.若Q1不为空,则Q1的数据元素出队,即数据元素在Q1出栈;
  • 3.若Q1为空且Q2不为空,则Q2的数据元素出队,即数据元素在Q2出栈;
  • 4.若Q1为空且Q2为空,即所构造的栈为空;
  • 入栈代码:
c 复制代码
int push_stack(queue_t *Q1,queue_t *Q2,int data){

    if(NULL == Q1 || NULL == Q2){
        printf("入参为NULL\n");
        return -1;
    }

    int num = 0;

    if(is_empty(Q1)){

        push_queue(Q1,data);

        while(!is_empty(Q2)){
             
             pop_queue(Q2,&num);
             push_queue(Q1,num);
        }
    } else {

        push_queue(Q2,data);

        while(!is_empty(Q1)){ 
  
             pop_queue(Q1,&num);
             push_queue(Q2,num);
        }

    }

    return 0;

}
  • 出栈代码:
c 复制代码
int pop_stack(queue_t *Q1,queue_t *Q2,int *data){

    if(NULL == Q1 || NULL == Q2 || NULL == data){
        printf("入参为NULL\n");
        return -1;
    }
    if(is_empty(Q1)){

        if(is_empty(Q2)){

            printf("栈空,出栈失败\n");


        } else {

            pop_queue(Q2,data);
        }

    } else {

         pop_queue(Q1,data);
    }


    return 0;
 
}
  • 实例2:
  • 用栈实现队列的功能;
  • 算法思想:
  • 若实现一个队列的功能,需要用到两个栈来实现此功能,创建两个栈S1和S2;
  • 入队列:
  • 所有的数据元素都入栈到S1,即所有的数据元素在S1完成入队列;
  • 出队列:
  • 判断S2是否为空;
  • 若S2不为空,则数据元素在S2出栈,即数据元素在S2完成出队列;
  • 若S2为空且S1不为空,则S1中所有数据元素依次在S1出栈并依次入栈到S2,接下来,所有的数据元素在S2出栈,即所有的数据元素在S2完成出队列;
  • 若S2为空且S1为空,即所构造的队列为空;
  • 入队列代码:
c 复制代码
int push_queue(stack_t *S1, int data){
    if(NULL == S1){
        printf("入参为NULL\n");
        return -1;
    }
    push_stack(S1, data);
    return 0;
}
  • 出队列代码:
c 复制代码
int pop_queue(stack_t *S1, stack_t *S2, int *data){
    if(NULL == S1 || NULL == S2 || NULL == data){
        printf("入参为NULL\n");
        return -1;
    }
    if(!is_empty(S2)){
        pop_stack(S2, data);
    }else{
        if(!is_empty(S1)){
            int num = 0;
            while(!is_empty(S1)){
                pop_stack(S1, &num);
                push_stack(S2, num);
            }
            pop_stack(S2, data);
        }else{
            printf("队列为空,出队失败\n");
        }
    }
    return 0;
}
相关推荐
小新同学^O^8 分钟前
简单学习 --> 模型微调
开发语言·人工智能·python·模型微淘
水云桐程序员9 分钟前
C++变量的概念及用法
开发语言·c++
小O的算法实验室14 分钟前
2026年ASOC,基于多目标优化去噪双存档进化算法+路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
水饺编程30 分钟前
第5章,[Win32 章节] :几种典型的颜色
c语言·c++·windows·visual studio
知识汲取者32 分钟前
巨量引擎营销 API 完整文档
开发语言·数据库·python
2601_9545267534 分钟前
逆向解析Temu底层动销算法:基于API高并发轮询与全域存量透视的自动化架构重构
算法·架构·自动化
Larry_Yanan1 小时前
QML面试常见问题(一)QML中组件呈现方式的方法有哪些
开发语言·c++·qt·ui·面试
Aurorar0rua1 小时前
CS50 x 2024 Notes C -12
c语言·开发语言·学习方法
jimy11 小时前
gnu89和c99中的inline关键字的关系和差异
c语言
Σίσυφος19001 小时前
数据标准化(拟合的时候使用非常重要)
人工智能·算法