q1和q2分别是一个队列(链队列),用两个队列模拟实现一个栈的规则如下:

如何入栈:

直接向q2里边入。

如何出栈:

如果q2不空,将q2除了最后一个数据外,剩余数据放到q1里,这个时候q2仅仅剩下一个数据,这个时候就可以出来。

如果q2为空,代表着数据都在q1里,将q1除了最后一个数据外,剩余数据放在q2里,这个时候q1只剩下最后一个数据,直接出即可。

注意:下边的代码需要链队列能实现的相关函数,链队列文章链接如下:

(34条消息) 数据结构——队列(链队列)_张淑芬~的博客-CSDN博客

用两个队列模拟实现的栈的结构体声明:

//用两个队列模拟实现的栈的结构体声明typedef struct Two_queue_stack
{struct LQueue q1;struct LQueue q2;
}Two_queue_stack, * PTwo_queue_stack;

可执行函数声明:

//初始化
void my_Init_two_queue_stack(struct Two_queue_stack* tqs);//入栈
bool my_Push(PTwo_queue_stack tqs, ELEM_TYPE val);//出栈(还需要一个输出参数,帮助我将出队的值带出来)
bool my_Pop(PTwo_queue_stack tqs, ELEM_TYPE* rtval);//获取栈顶元素值(还需要一个输出参数,帮助我将出队的值带出来)
bool my_Top(PTwo_queue_stack tqs, ELEM_TYPE* rtval);//判空
bool my_IsEmpty(PTwo_queue_stack tqs);//有效元素个数
int my_Get_length(PTwo_queue_stack tqs);//打印
void my_Show(PTwo_queue_stack tqs);//清空
void my_Clear(PTwo_queue_stack tqs);//销毁
void my_Destroy(PTwo_queue_stack tqs);

下面来依次实现相关函数:

初始化:

void my_Init_two_queue_stack(struct Two_queue_stack* tqs)
{assert(tqs != NULL);Init_LQueue(&tqs->q1);//这里调用队列的初始化函数,分别对q1,q2进行初始化Init_LQueue(&tqs->q2);
}

入栈,出栈:

//入栈
bool my_Push(PTwo_queue_stack tqs, ELEM_TYPE val)
{assert(tqs != NULL);return Push(&tqs->q2,val);
}//出栈(还需要一个输出参数,帮助我将出队的值带出来)
bool my_Pop(PTwo_queue_stack tqs, ELEM_TYPE* rtval)
{assert(tqs != NULL);if (my_IsEmpty(tqs)){return false;}if (!IsEmpty(&tqs->q2))//q2不空  直接出(仅剩下一个元素,其他的全部挪到另一边){int len = Get_length(&tqs->q2);while (len>1){ELEM_TYPE tmp;Pop(&tqs->q2, &tmp);Push(&tqs->q1, tmp);len--;}return Pop(&tqs->q2, rtval);}else//q2为空  确定值都在q1里面{int len = Get_length(&tqs->q1);while (len > 1){ELEM_TYPE tmp;Pop(&tqs->q1, &tmp);Push(&tqs->q2, tmp);len--;}return Pop(&tqs->q1, rtval);}
}

获取栈顶元素值(还需要一个输出参数,帮助我将出队的值带出来)

bool my_Top(PTwo_queue_stack tqs, ELEM_TYPE* rtval)
{assert(tqs != NULL);if (my_IsEmpty(tqs)){return false;}if (!IsEmpty(&tqs->q2))//q2不空  直接出(仅剩下一个元素,其他的全部挪到另一边){int len = Get_length(&tqs->q2);while (len > 1){ELEM_TYPE tmp;Pop(&tqs->q2, &tmp);Push(&tqs->q1, tmp);len--;}Pop(&tqs->q2, rtval);Push(&tqs->q1, *rtval);return true;}else//q2为空  确定值都在q1里面{int len = Get_length(&tqs->q1);while (len > 1){ELEM_TYPE tmp;Pop(&tqs->q1, &tmp);Push(&tqs->q2, tmp);len--;}Pop(&tqs->q1, rtval);Push(&tqs->q2, *rtval);return true;}
}

判空,获取有效个数

//判空
bool my_IsEmpty(PTwo_queue_stack tqs)
{assert(tqs != NULL);if (IsEmpty(&tqs->q1) && IsEmpty(&tqs->q2)){return true;}return false;
}//有效元素个数
int my_Get_length(PTwo_queue_stack tqs)
{return Get_length(&tqs->q1) + Get_length(&tqs->q2);
}

打印,清空,销毁

//打印
void my_Show(PTwo_queue_stack tqs)
{assert(tqs != NULL);Show(&tqs->q1);Show(&tqs->q2);
}//清空
void my_Clear(PTwo_queue_stack tqs)
{assert(tqs != NULL);Clear(&tqs->q1);Clear(&tqs->q2);
}//销毁
void my_Destroy(PTwo_queue_stack tqs)
{assert(tqs != NULL);Destroy(&tqs->q1);Destroy(&tqs->q2);
}

测试案例:

int main()
{struct Two_queue_stack head;//两个队列实现一个栈的结构体声明my_Init_two_queue_stack(&head);//初始化for (int i = 1; i <= 3; i++){my_Push(&head, i);//1到3入栈}my_Show(&head);//打印1到3ELEM_TYPE flag;bool tag = my_Pop(&head, &flag);//出栈顶元素,也就是3if (tag){printf("Pop = %d\n", flag);//如果tag为真,打印栈顶元素3}my_Show(&head);//打印函数,此时应该只剩1,2for (int i = 4; i <= 6; i++){my_Push(&head, i);将4到6入栈}my_Show(&head);//打印my_Pop(&head, &flag);//出栈顶元素printf("Pop = %d\n", flag);//打印栈顶元素my_Pop(&head, &flag);//出栈顶元素printf("Pop = %d\n", flag);//打印栈顶元素my_Pop(&head, &flag);//出栈顶元素printf("Pop = %d\n", flag);//打印栈顶元素my_Pop(&head, &flag);//出栈顶元素printf("Pop = %d\n", flag);//打印栈顶元素printf("length = %d\n", my_Get_length(&head));//打印有效长度my_Top(&head, &flag);//获取栈顶元素并打印printf("Top = %d\n", flag);printf("length = %d\n", my_Get_length(&head));//打印有效长度my_Destroy(&head);//销毁return 0;
}

测试结果:

如何用两个队列模拟实现一个栈相关推荐

  1. 用两个队列模拟实现一个栈的过程

    栈具有"后进先出"的特点,即某个元素最后进入栈,却最先出栈:队列具有"先进先出"的特点,即元素从队尾依次进队列,依次从队头出队列:现在用两个队列模拟实现一个栈的 ...

  2. 【HDU 1276】士兵队列训练问题(两个队列模拟)

    题目链接 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1276 解题思路 两个队列模拟即可,注意: 必须每一轮都点完,而不是数到只剩三人了就停止. 如 ...

  3. 【两个队列模拟栈】——栈与队列

    题目 用两个队列模拟实现栈的操作原题链接 思路 我是用两个list模拟的,没有用java的queue,下次用queue. 思想就是:元素进入一个list1,当list1中元素多余1个时,将list1的 ...

  4. 数据结构:栈和列之如何用两个队列实现一个栈?两个栈实现一个队列?

    1.栈和队列分析 栈是一种特殊的线性表.其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行 队列(Queue)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的 ...

  5. 用队列实现栈--用两个队列模拟实现栈

    出栈:哪个队列不为空,将该队列中前n-1个元素挪到另一个空队列中,然后将该队列中仅剩的元素出队列. 入栈:哪个队列不为空,将元素放到哪个队列中即可. 获取栈顶元素:哪个队列不为空,该队列的队尾就是栈顶 ...

  6. 栈与队列4——用一个栈实现另一个栈的排序

    题目 一个栈A的元素类型为整形,仅使用一个栈B,来实现栈A从栈顶到栈底元素是从大到小的顺序. 思路 原来的栈为stack,申请的栈为help,当前stack的栈顶元素记为cur 如果cur小于help ...

  7. 栈和队列之用一个栈实现另一个栈的排序

    用一个栈实现另一个栈的排序 题目: 一个栈元素的类型为整数,现在要想将该栈从顶到底按从大到小的顺序排列,只允许申请一个栈,除此之外, 可以申请一个变量,可以申请额外的变量,但是不能申请额外的数据结构, ...

  8. 两片74161实现60进制_如何用两片74160来接一个60进制的计数器

    展开全部 74160是一个10进制计数芯片,用两片可构32313133353236313431303231363533e4b893e5b19e31333433646433成最大为100进制的计数器,只 ...

  9. C/C++面试题—使用STL两个队列实现一个栈

    题目介绍 使用STL中的两个队列实现一个栈,实现栈的top.pop.push.clear等操作. 思路分析 思路和使用2个栈实现一个队列是相通的,用一个队列queue1容器用来 压栈,出栈的时候判断q ...

  10. java 栈和队列实现迷宫代码_使用两个队列实现一个栈

    两个队列实现一个栈 栈的特点是后进先出,队列的特点是先进先出.使用两个队列模拟栈,实现栈的push,pop,top,empty 操作. 假设队列中均为数字,其中队列q1为操作队列,q2为辅助队列. p ...

最新文章

  1. Bootstrap 按钮组
  2. IntelliJ Idea取消Colud not autowire.No
  3. 求最大值及其下标编程总结
  4. 认识适配器:JSON绑定概述系列
  5. 总结与整理:Ubuntu系统下安装、配置Nginx及其他注意事项
  6. 程序员的脑回路太清奇,就一件衣服跟我叨叨半天
  7. 第一章:WTL的5个W
  8. 底层电子电路基础知识
  9. STM32编程软件分享——MDK5安装包以及调试工具
  10. 条形码类型及常见条形码
  11. vue.js—60秒倒计时
  12. 抓取百度页面html,百度蜘蛛不抓取页面的解决方法
  13. android 获取图片信息 之 ExifInterface
  14. android 通过adb命令控制wifi开关
  15. 微信内置浏览器调试和调试微信内的H5页面汇总(持续更新...)
  16. Kubernetes容器平台架构之道
  17. 中南大学计算机学院张伟,张伟(数学家)_百度百科
  18. 集牛气 展虎威 | 指令集祝您新春快乐,虎年大吉!
  19. 网关 Gateway
  20. 社区java视频大宝库_Java大牛手把手带你实现社区论坛项目实战课程

热门文章

  1. 暗黑破坏神不朽怎么在电脑上玩 暗黑破坏神不朽模拟器教程
  2. 打开微信备份文件db_安卓手机微信数据导出方法-adb备份(无需root) - Fenlog软件...
  3. kali工具 -- setoolkit(克隆网站及利用)
  4. Chrome浏览器下载zoom录像
  5. 操作系统之银行家算法实现代码
  6. 利用栈来完成表达式求值
  7. python blp模型 估计_简述BLP模型
  8. [Qualcomm][MSM8937] MSM89XX平台上加载modem固件失败
  9. Android oem 解锁
  10. 什么是CTI?呼叫中心系统CTI技术的应用