当前位置: 首页 > news >正文

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

  • 队列与栈:
  • 队列(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为空,即所构造的栈为空;
  • 入栈代码:
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;}
  • 出栈代码:
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为空,即所构造的队列为空;
  • 入队列代码:
int push_queue(stack_t *S1, int data){if(NULL == S1){printf("入参为NULL\n");return -1;}push_stack(S1, data);return 0;
}
  • 出队列代码:
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;
}
http://www.lryc.cn/news/151801.html

相关文章:

  • PY32F003F18P单片机概述
  • 查看GPU占用率
  • 设计模式-中介者模式
  • react 大杂烩
  • 图解 STP
  • Kubernetes技术--k8s核心技术Controller控制器
  • Kubernetes技术--k8s核心技术 Secret
  • day27 String类 正则表达式
  • Java设计模式:四、行为型模式-10:访问者模式
  • 【juc】读写锁ReentrantReadWriteLock
  • Linux开机启动Tomcat
  • javaweb、spring、springmvc和springboot有什么区别,都是做什么用的?
  • 已解决module ‘pip‘ has no attribute ‘pep425tags‘报错问题(如何正确查看pip版本、支持、32位、64位方法汇总)
  • Matlab(画图初阶)
  • 汽车自适应巡航系统控制策略研究
  • C语言面试题值反转字符串
  • 【大数据】Apache Iceberg 概述和源代码的构建
  • 对分库分表进行批量操作
  • 大数据组件-Flume集群环境的启动与验证
  • 【包过滤防火墙——iptables静态防火墙】的简单使用
  • 关于MySQL数据库版本不同导致表进行比较的时候报错illegal mix of collations...的问题
  • 进程、操作系统
  • hadoop学习:mapreduce入门案例四:partitioner 和 combiner
  • HTTP与SOCKS5的区别对比
  • 在阿里云请求发短信接口去掉证书验证
  • k8s里pv pvc configmap
  • 【Atcoder】 [ARC144D] AND OR Equation
  • python使用字典暴力解析wifi密码
  • java八股文面试[多线程]——synchronized锁升级详细流程
  • ui网页设计实训心得