“栈”和“队列”(Java)

本文探讨了栈和队列两种常见的数据结构,它们都是线性结构。栈遵循先进后出(LIFO)原则,而队列遵循先进先出(FIFO)原则。通过图例和Java代码示例,详细解释了栈和队列的工作原理及操作过程。
摘要由CSDN通过智能技术生成

栈和队列是一种比较常见的数据结构,它们都是属于线性结构的一种数据类型,两者之间有很多相同和共通之处,下面通过图例和实际代码来演示这两种数据结构之间它们到底有什么相同和不同之处。

一、栈

栈由栈顶栈底组成。具体什么是栈,我们可以把栈想象成一个手枪弹夹,弹夹里面的每颗子弹就是栈里面的每个元素,它遵循先进后出的原则,就好比手枪弹夹里面先压入的子弹要比后压入的子弹后击发,每压入一发子弹,前压入的子弹就要往下移动一个位置,留出的位置刚好留给后压入的子弹,一直到整个弹夹都压满为止,子弹与子弹之间是一种上下叠压的关系。
在这里插入图片描述
下面是栈存储元素和操作元素的执行示意图
在这里插入图片描述

代码演示:

1、封装一个util工具类,里面存放操作栈的各种方法。

package demo2;

import java.util.Arrays;

public class MyStack {

    int[] elements; //目标数组

    public MyStack() {
        elements = new int[0]; //初始化数组长度
    }

    //查看元素的长度
    public void size(){
        System.out.println(Arrays.toString(elements));
    }

    //往栈里面压入元素
    public void add(int element){
        int[] newArray = new int[elements.length + 1]; //创建的新数组的长度要比目标数组的长度(容量)要大,要不然存放不下要新添的元素
        for(int i = 0; i<elements.length; i++){ //把目标数组的所有元素拷贝进新数组中
            newArray[i] = elements[i];
        }
        newArray[elements.length] = element; //把添加进来的新元素,追加到新数组的末尾位置
        elements=newArray; //新数组替换到目标数组
    }

    //取出栈顶元素
    public int pop(){
        if(elements.length == 0){ //判断,栽中有没有元素
            throw new RuntimeException("stack is empty");
        }
        int element = elements[elements.length - 1]; //取出目标数组的最后一个元素
        int[] nweArray = new int[elements.length - 1]; //创建一个新数组,用于存放目标数组里面剩余的元素,长度与取出栈顶元素目标数组的长度一致
        for(int i = 0; i < elements.length - 1; i++){ // i < elements.length - 1 : 因为已经取出了一个元素,所以要减去 1
            nweArray[i] = elements[i];
        }
        elements = nweArray; //新数组替换目标数组
        return element; //返回取出的栈顶元素
    }

    //原栈元素不动,仅查看栈顶元素,
    public int peek(){
        if(elements.length == 0){ //判断,栽中有没有元素
            throw new RuntimeException("stack is empty");
        }
        return elements[elements.length - 1];
    }

    //判断栈是否为空
    public boolean isEmpty(){
        return elements.length == 0; //如果为0,则返回false,否则返回ture.
    }
}

2、编写一个测试类,测试和调用工具类里面的方法

package demo2;

public class TestMyStack {
    public static void main(String[] args) {
        
        MyStack ms = new MyStack(); //创建一个栽
        
        //往栽里面压入元素
        ms.add(9);
        ms.add(8);
        ms.add(7);
        
        //查看元素
        ms.size();
        
        //取出栽顶元素
//        System.out.println(ms.pop());
//        System.out.println(ms.pop());
//        System.out.println(ms.pop());

        //查看栈顶元素
        System.out.println(ms.peek());
        ms.pop();
        System.out.println(ms.peek());

        //判断栈顶是否为空
        System.out.println(ms.isEmpty());

    }
}

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

二、队列

队列由队头队尾组成,遵循先进先出的原则。我们可以把队列想象成一群人排队过同一个安检口,排在队伍最前面的那个人,就是队头,反之,排在队伍最后面的哪个人就是队尾,等安检开检的时候,一定是排在队伍最前面的那个人,最先通过安检。

下面是队列存储元素和操作元素的执行示意图
在这里插入图片描述
在这里插入图片描述
代码演示:

1、封装一个util工具类,里面存放操作队列的各种方法。

package demo2;

/**
 * 队列,先进先出
 */
public class MyQueue {
    int[] elements; //目标数组

    public MyQueue() {
        elements = new int[0]; //初始化数组长度
    }

    //往队列添加数组(入队)
    public void add(int element){
        int[] newArray = new int[elements.length + 1]; //新写一个数组
        for(int i = 0; i < elements.length; i++){
            newArray[i] = elements[i];
        }
        newArray[elements.length] = element;
        elements = newArray; //新数组替换目标数组
    }

    //出队
    public int poll(){
        int element = elements[0]; //取出队列中的第0个元素
        int[] newArray = new int[elements.length - 1]; //新建数组
        for(int i = 0; i < newArray.length; i++){
            newArray[i] = elements[i + 1];
        }
        elements = newArray;
        return element;
    }

    //判断队列是否为空
    public boolean isEmpty(){
        return elements.length == 0;
    }
}

2、编写一个测试类,测试和调用工具类里面的方法

package demo2;

public class TestMyQueue {
    public static void main(String[] args) {
        //创建一个队列
        MyQueue mq = new MyQueue();
        
        //入队
        mq.add(9);
        mq.add(8);
        mq.add(7);
        
        //出队
        System.out.println(mq.poll());
        mq.add(6);
        System.out.println(mq.poll());
        System.out.println(mq.poll());
        System.out.println(mq.isEmpty());
        System.out.println(mq.poll());
//        System.out.println(mq.isEmpty());


    }

}

运行结果:
在这里插入图片描述
以上就是栈和队列的全部相关内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值