用两个队列实现栈——C语言实现
如何用两个队列实现栈?
思路分析:建立队列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.队列接口函数引入 2.栈的初始化 3.向栈中插入元素 4.出栈操作 5.取出栈顶元素 6.判断栈是否为空 7.释放内存空间 总结 前言 本文章主要介绍栈和队列的 ...
- 剑指offer之两个队列实现栈的问题
1 问题 两个队列实现栈的插入和获取头部元素的功能 2 分析 1)获取头部元素的功能分析: 我们有2个队列,我们知道队列的特点的先进先出,而栈的特点是先进后出,比如我们有数据1,2,3,4,我们分别依 ...
- 两个栈实现队列与两个队列实现栈
1. 两个栈实现队列 实现一 思路 s1是入栈的,s2是出栈的. 入队列,直接压到s1是就行了 出队列,先把s1中的元素全部出栈压入到s2中,弹出s2中的栈顶元素:再把s2的所有元素全部压回s1中 实 ...
- 20190805:两个队列实现栈
两个队列实现栈的java实现 两个队列实现栈 大致思路 代码实现 两个队列实现栈 力扣简单习题: 大致思路 代码实现 package com.immunize.leetcode.implementQu ...
- Python:两个队列实现栈,两个栈实现队列
1.两个栈实现一个队列 有三种思路: 思路一:将stack1作为存储空间,将stack2作为临时缓冲区,入队时,直接压入stac1,出队时,将stack1中的元素依次出栈压入stack2中,再将sta ...
- 两个栈实现队列+两个队列实现栈----java
2019独角兽企业重金招聘Python工程师标准>>> 一.两个栈实现一个队列 思路:所有元素进stack1,然后全部出stack1并进入stack2.实现队列的先进先出即:若sta ...
- 脱裤子放屁之用两个栈实现队列、用两个队列实现栈
牛客网上有一道很nt的题目,用两个栈实现队列,你直接用队列不好吗?还耗内存,真的是脱裤子放屁,但是骂归骂,题目还是要做的. 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为in ...
- 【两个队列模拟栈】——栈与队列
题目 用两个队列模拟实现栈的操作原题链接 思路 我是用两个list模拟的,没有用java的queue,下次用queue. 思想就是:元素进入一个list1,当list1中元素多余1个时,将list1的 ...
- C++用两个队列实现栈
1. 基础 队列:先进先出,即插入数据在队尾进行,删除数据在队头进行: 栈:后进先出,即插入与删除数据均在栈顶进行. 2. 思路 两个队列实现一个栈的思想:用dataQueue队列作为push数据的队 ...
最新文章
- R语言dplyr包coalesce函数处理缺失值(missing value)实战
- 基于TCP协议的socket通信
- 判断回文链表(剑指offer.027)
- 信息安全风险评估实施
- C++/C 宏定义(define)中# ## 的含义(转)
- 技术管理中的“沟通”
- mysql binlog c++_关于MySQL的日志管理(binlog)
- 可靠型园区网组网,用VRRP还是堆叠?
- Python 命令行非阻塞输入
- Zookeeper 3.6.0启动时 8080端口被占用
- linux驱动程序启动失败,打开程序提示加载驱动失败?三种故障原因及解决方法...
- Matlab是常见的高级语,高级语言具有哪些特点 试述低级语言与高级语言的特点...
- ①读后感之《当我们谈论爱情时我们在谈论什么》┊(美)雷蒙德.卡佛
- android 车载蓝牙音乐介绍
- 如何清除360网站服务器缓存,360安全浏览器怎样清除缓存360浏览器缓存清理
- 【iOS】—— 高德地图SDK基础使用
- 2022-iOS个人开发者账号申请流程
- PWA之 Service worker
- 超实用的Excel自动排序小技巧,原来这么简单,早点知道就好了!
- 嵌入式行业是个坑吗?