【算法】【栈和队列模块】使用栈数据结构实现一个队列的基本功能
2023-09-11 14:14:53 时间
前言
当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~
问题介绍
原问题
使用栈数据结构实现一个队列的基本功能:pop,poll,isEmpty
解决方案
解决思路,具体逻辑为:
1、纳管两个Stack栈结构,inStack,outStack,一个负责入队列、一个负责出队列
步骤:
1、入队列:inStack直接push即可
3、出队列:outStack需要inStack中的全部数值,outStack再弹出一个即可
时间:O(1) 空间 O(n)
代码编写
java语言版本
方案一实现:
public class TowStacksQueue {
private Stack<Integer> inStack;
private Stack<Integer> outStack;
public TowStacksQueue() {
this.inStack = new Stack<>();
this.outStack = new Stack<>();
}
/**
* 队列进
* @param num
*/
public void add(Integer num){
inStack.push(num);
}
/**
* 队列出一个
* @return
*/
public Integer poll(){
if(inStack.isEmpty() && outStack.isEmpty()){
throw new RuntimeException("双栈空,没有数据了~");
}
if(outStack.isEmpty()){
while (!inStack.isEmpty()){
outStack.push(inStack.pop());
}
}
return outStack.pop();
}
/**
* 队列尾巴元素
* @return
*/
public Integer peek(){
if(inStack.isEmpty() && outStack.isEmpty()){
throw new RuntimeException("双栈空,没有数据了~");
}
if(outStack.isEmpty()){
while (!inStack.isEmpty()){
outStack.push(inStack.pop());
}
}
return outStack.peek();
}
public boolean isEmpty(){
return inStack.isEmpty() && outStack.isEmpty();
}
@Override
public String toString() {
return "TowStacksQueue{" +
"inStack=" + inStack +
", outStack=" + outStack +
'}';
}
//private static final Logger log = Logger.getLogger("TowStacksQueue");
public static void main(String[] args) {
TowStacksQueue towStacksQueue = new TowStacksQueue();
int[] arr = {2, 1, 4, 5, 3};
// 随机吐出来一个,验证半途中poll
int index = (int)(Math.random() * arr.length);
for (int i = 0; i < arr.length; i++){
System.out.printf("当前进入字符%d\n", arr[i]);
towStacksQueue.add(arr[i]);
System.out.printf("当前队列:%s\n", towStacksQueue.toString());
if (i == index){
System.out.printf("随机吐出:%d\n", towStacksQueue.poll());
}
}
// 吐
while (!towStacksQueue.isEmpty()){
Integer poll = towStacksQueue.poll();
System.out.printf("吐出当前队列头:%s\n", poll);
System.out.printf("当前队列:%s\n", towStacksQueue.toString());
}
}
}
c语言版本
正在学习中
c++语言版本
正在学习中
思考感悟
此题较简单,从中可以看出来算法主要体现的就是栈和队列之间的最大区别,栈先进后出,队列先进先出,所以必然有一个过程就是栈需要全部弹出来才能实现队列的逻辑。
写在最后
方案和代码仅提供学习和思考使用,切勿随意滥用!如有错误和不合理的地方,务必批评指正~
如果需要git源码可咨询2260755767@qq.com或在评论区回复即可.
相关文章
- Java实现 蓝桥杯 算法提高 双十一抢购
- java算法集训代码填空题练习3
- Java实现 蓝桥杯VIP 算法训练 大小写判断
- Java实现 蓝桥杯VIP 算法训练 快速排序
- OpenCV每日函数 计算摄影模块(1) 图像修复算法 inpaint函数
- OpenCV每日函数 计算摄影模块(3) HDR动态范围成像算法
- PCL 点到面的ICP算法
- YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进【NO.68】添加CSPNeXt模块
- 【YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进NO.61】结合最新的CVPR2023年Fasternet网络模块
- 字符串匹配的Boyer-Moore算法
- NLP之NNLM:NNLM神经语言模型算法(词向量法的始祖)的简介、网络结构、案例应用、代码实现之详细攻略
- Interview:算法岗位面试—10.17早上—上海某科技公司算法岗位(偏算法,独角兽)非技术面试之比赛项目讲解和项目意义的探讨
- DL之ShuffleNet:ShuffleNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-2 算法训练 最大最小公倍数
- 一种用于模拟电晕放电的高效半拉格朗日算法(Matlab代码实现)
- 滑动窗口算法:3. 无重复字符的最长子串
- 一致性哈希算法的应用及实现
- 目标检测算法——YOLOv5/YOLOv7改进结合轻量型Ghost模块
- 对Python中文分词模块结巴分词算法过程的理解和分析
- 【Python】蒙特卡洛模拟 | PRNG 伪随机数发生器 | LCG 线性同余算法 | 马特赛特旋转算法 | Python Random 模块