如何用两个队列实现栈?

思路分析:建立队列q1,在第队列中入队元素1,2,3,4。

我们知道,队列是先进先出的,如果出队的话,得到的元素是1,而不是4。而按照栈的要求,出栈的元素应该是4.

那么怎样得到队列的最后一个元素4呢?这个时候,就要借助第二个队列了。建立空队列q2,我们可以将队列的中元素一个个出队,然后将出来的元素入队到队列q2中。这样,分别将1,2,3从队列q1中出队,然后入队队列q2。当最后一个元素4从q1中出队时,将这个元素返回即可。这样,一次循环下来,1,2,3元素从q1到了q2,队列最后一个元素4被排出,实现了后进先出的操作,相当于栈的pop操作。

下次pop的时候,再进行同样的操作即可,只是这时候元素都移动到q2中了,我们从q2中循环出队元素到q1中即可。

我们试着写一下代码,首先通过数组实现队列,定义入队和出队的函数:

struct Queue {int a[20];int head, tail;//head代表第一个元素的下标,tail代表将要插入元素的下标
};
void enqueue(struct Queue* q, int node) {if ((q->tail + 1) % 20 == q->head) {printf("Queue has no room!\n");return;}q->tail = (q->tail + 1) % 20;q->a[q->tail] = node;
}
int dequeue(struct Queue* q) {if (q->head == q->tail) {printf("Queue has no node!\n");return -1;}q->head = (q->head + 1) % 20;return q->a[q->head];
}

接下来就是题目的关键,利用两个队列,实现栈的pop操作:

int pop(struct Queue* q1, struct Queue* q2) {while ((q1->head + 1) % 20 < q1->tail) {int n = dequeue(q1);enqueue(q2, n);}int n = dequeue(q1);return n;
}

主函数测试一下:

int main() {struct Queue q1, q2;enqueue(&q1, 1);enqueue(&q1, 2);int n = pop(&q1, &q2);printf("%d", n);printf("%d", pop(&q2, &q1));return 0;
}

需要注意的是,在主函数中测试时,pop函数每次调用的时候,q1和q2要互换位置,因为每次pop,元素都会从一个队列搬到另一个队列。

用两个队列实现栈——C语言实现相关推荐

  1. 【使用两个队列实现栈】

    文章目录 前言 使用两个队列实现栈 1.队列接口函数引入 2.栈的初始化 3.向栈中插入元素 4.出栈操作 5.取出栈顶元素 6.判断栈是否为空 7.释放内存空间 总结 前言 本文章主要介绍栈和队列的 ...

  2. 剑指offer之两个队列实现栈的问题

    1 问题 两个队列实现栈的插入和获取头部元素的功能 2 分析 1)获取头部元素的功能分析: 我们有2个队列,我们知道队列的特点的先进先出,而栈的特点是先进后出,比如我们有数据1,2,3,4,我们分别依 ...

  3. 两个栈实现队列与两个队列实现栈

    1. 两个栈实现队列 实现一 思路 s1是入栈的,s2是出栈的. 入队列,直接压到s1是就行了 出队列,先把s1中的元素全部出栈压入到s2中,弹出s2中的栈顶元素:再把s2的所有元素全部压回s1中 实 ...

  4. 20190805:两个队列实现栈

    两个队列实现栈的java实现 两个队列实现栈 大致思路 代码实现 两个队列实现栈 力扣简单习题: 大致思路 代码实现 package com.immunize.leetcode.implementQu ...

  5. Python:两个队列实现栈,两个栈实现队列

    1.两个栈实现一个队列 有三种思路: 思路一:将stack1作为存储空间,将stack2作为临时缓冲区,入队时,直接压入stac1,出队时,将stack1中的元素依次出栈压入stack2中,再将sta ...

  6. 两个栈实现队列+两个队列实现栈----java

    2019独角兽企业重金招聘Python工程师标准>>> 一.两个栈实现一个队列 思路:所有元素进stack1,然后全部出stack1并进入stack2.实现队列的先进先出即:若sta ...

  7. 脱裤子放屁之用两个栈实现队列、用两个队列实现栈

    牛客网上有一道很nt的题目,用两个栈实现队列,你直接用队列不好吗?还耗内存,真的是脱裤子放屁,但是骂归骂,题目还是要做的. 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为in ...

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

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

  9. C++用两个队列实现栈

    1. 基础 队列:先进先出,即插入数据在队尾进行,删除数据在队头进行: 栈:后进先出,即插入与删除数据均在栈顶进行. 2. 思路 两个队列实现一个栈的思想:用dataQueue队列作为push数据的队 ...

最新文章

  1. R语言dplyr包coalesce函数处理缺失值(missing value)实战
  2. 基于TCP协议的socket通信
  3. 判断回文链表(剑指offer.027)
  4. 信息安全风险评估实施
  5. C++/C 宏定义(define)中# ## 的含义(转)
  6. 技术管理中的“沟通”
  7. mysql binlog c++_关于MySQL的日志管理(binlog)
  8. 可靠型园区网组网,用VRRP还是堆叠?
  9. Python 命令行非阻塞输入
  10. Zookeeper 3.6.0启动时 8080端口被占用
  11. linux驱动程序启动失败,打开程序提示加载驱动失败?三种故障原因及解决方法...
  12. Matlab是常见的高级语,高级语言具有哪些特点 试述低级语言与高级语言的特点...
  13. ①读后感之《当我们谈论爱情时我们在谈论什么》┊(美)雷蒙德.卡佛
  14. android 车载蓝牙音乐介绍
  15. 如何清除360网站服务器缓存,360安全浏览器怎样清除缓存360浏览器缓存清理
  16. 【iOS】—— 高德地图SDK基础使用
  17. 2022-iOS个人开发者账号申请流程
  18. PWA之 Service worker
  19. 超实用的Excel自动排序小技巧,原来这么简单,早点知道就好了!
  20. 嵌入式行业是个坑吗?

热门文章

  1. 计算机组成原理包健百度云,计算机组成原理包健版答案及解析.doc
  2. yii2 框架使用gii工具创建模块
  3. poj3666(基础dp+离散化)
  4. 统一建模语言UML(1)概述
  5. 基于Java的开源3D游戏引擎jMonkeyEngine
  6. ARINC 429总线接收器的输入共模电压
  7. 基于springboot与layui的防疫物资管理管理系统
  8. 为什么微网中要用到下垂控制
  9. Oracle 定时任务job使用详解
  10. 数据结构之哈希表以及常用哈希的算法表达(含全部代码)