IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 详解java用队列实现栈,原理+代码 -> 正文阅读

[Java知识库]详解java用队列实现栈,原理+代码

栈的特点:先进后出
队列的特点:先进先出
显然,单个队列我们是无法实现栈的操作的,我们这里采用两个队列来实现。

1.入栈、出栈的原理
在这里插入图片描述

比如我们现在有一个栈和两个队列,两队列用于模拟实现栈,现有数据12,23,34

我们现在入栈12,23,34,先将数据按顺序放入queue1里面
在这里插入图片描述

那我们现在要栈里面出一个34怎么办?因为队列里面必须是队头先出,那我们就把queue1里面的size-1(也就是2)个元素全部放入queue2里面,剩下一个元素就是我们栈中要出的元素
在这里插入图片描述
这时34出栈了,我们再要出23怎么办?
在这里插入图片描述
同样的道理,把queue2中size-1(也就是1)个元素出到queue1中,剩下最后一个就是要出的
在这里插入图片描述

总结如下:
1.入栈的时候,入到不为空的队列(我们这里刚开始两个队列都为空时默认是queue1)
2.出栈的时候,找到不为空的队列,出size-1个元素到另一个队列,剩下的这个元素就是出栈的元素

2.代码实现:

import java.util.LinkedList;
import java.util.Queue;
public class MyStack {
    //用队列实现栈
    private Queue<Integer> queue1;
    private Queue<Integer> queue2;

    public MyStack(){
        queue1=new LinkedList<>();
        queue2=new LinkedList<>();
    }

    public void push(int x){//入栈
        if (!queue1.isEmpty()){
            queue1.offer(x);
        }else if(!queue2.isEmpty()){
            queue2.offer(x);
        }else{//两个都为空,我们默认放到queue1里面
            queue1.offer(x);
        }
    }

    public int pop(){//出栈
        if(empty()){//两队列全为空的情况——也就是栈里没有元素了
            return -1;
        }
        if (!queue1.isEmpty()){
            int size=queue1.size();//这里不能直接把queue1.size()放到for循环里面
            //因为你for循环里面每次都要出一个元素,size会越来越小
            //比如原先size=4,里面4个元素,i=0
            //出一个元素,size=3,里面3个元素,i=1
            //出一个元素,size=2,里面2个元素,i=2
            //这时显然我们需要的循环还没有结束,但是如果直接把queue1.size()放到for循环里面它已经结束了
            for(int i=0;i<size-1;i++){
                    //把queue1里面的元素出到queue2里面
                    //一共出size-1个——queue1最后一个也就是我们要pop的元素
                    int val=queue1.poll();
                    queue2.offer(val);
                }
                return queue1.poll();
            }
        if (!queue2.isEmpty()){
            int size=queue2.size();
            for(int i=0;i<size-1;i++){
                    //把queue2里面的元素出到queue1里面
                    //一共出size-1个——queue2最后一个也就是我们要pop的元素
                    int val=queue2.poll();
                    queue1.offer(val);
                }
                return queue2.poll();
            }
        return -1;//这里是为了编译不报错,因为上面都是用的if,这句代码实际用不到,仅仅是为了编译通过

    }

    public int top(){//得到队头元素
        if(empty()){
            return -1;
        }

        if(!queue1.isEmpty()){
            int val=0;
            int size=queue1.size();
            for (int i=0;i<size;i++){
                val=queue1.poll();
                queue2.offer(val);
            }
            return val;
        }

        if ((!queue2.isEmpty())){
            int val=0;
            int size=queue2.size();
            for(int i=0;i<size;i++){
                val=queue2.poll();
                queue1.offer(val);
            }
            return val;
        }
        return -1;
    }

    public boolean empty(){//判断栈是否为空
        return queue1.isEmpty()&&queue2.isEmpty();
    }

    public static void main(String[] args) {
        MyStack myStack=new MyStack();
        //入栈
        myStack.push(1);
        myStack.push(2);
        myStack.push(3);
        myStack.push(4);
        System.out.println(myStack.top());//打印栈顶元素4

        //出栈
        myStack.pop();//删除栈顶元素4
        System.out.println(myStack.top());//打印栈顶元素3
    }
}

运行结果如下:
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-01-17 11:22:16  更:2022-01-17 11:22:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:58:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码