栈和队列

一:栈的构造和应用

先进后出
图1

public class Stack {
        //栈的底层实现是数组
        long[] arr ;
        //表示栈顶
        int top;

        //构造方法
    public Stack(){
        arr = new long[10];
        top = -1;  //初始化栈顶没有数据
    }
    public Stack(int length){
        arr = new long[length];
        top = -1;
    }

    //添加数据--压栈
    public void push(long value){
        arr[++top] = value;
    }

    //删除数据--弹栈
    public long pop(){
        return arr[top--];  //弹栈后数组长度减少
    }

    //查看数据
    public long peek(){
        return arr[top];  //查看数据,不会弹出数据
    }

    //判断是否为空
    public boolean isEmpty(){
        return top==-1;  //返回true则为空
    }

    //判断是否满了
    public boolean isFull(){
        return top==arr.length-1;  //top和数组长度减1 是否相等
    }

}

//main方法

public class Test {
    public static void main(String[] args) {
        Stack stack = new Stack(5);

        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);
        //stack.push(6);  如果压栈数量大于指定栈长度就会报错

        System.out.println("长度: "+(stack.top+1));

        long pop = stack.pop();
        System.out.println("弹栈: "+ pop);

        long peek = stack.peek();
        System.out.println("查看数据: "+peek);

        boolean empty = stack.isEmpty();
        System.out.println("是否为空: "+empty);

        boolean full = stack.isFull();
        System.out.println("是否满: "+full);

        System.out.println("长度: "+(stack.top+1));
    }
}

二:列队的构造和应用

先进先出
图2

1.常规列队(remove全部数据后无法再插入数据)
public class Quene {
    //队列底层也是数组
    long[] arr;
    //队列长度
    int length;
    //队头
    int front;
    //队尾
    int end;

    //构造方法
    public Quene(){
        arr = new long[10];
        length=0;
        front=0;
        end=-1;
    }
    public Quene(int size){
        arr = new long[size];
        length=0;
        front=0;
        end=-1;
    }

    //1.添加数据,从队列尾插入
    public void insert(long value){
        arr[++end] = value;
        length++;
    }

    //2.删除数据,从队头开始
    public long romove(){
        length--;            //长度减减
        return arr[front++]; //把第一个数据移除,队头就会++
    }

    //3.查看数据,从队头查看
    public long peek(){
        return arr[front];
    }

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

    //5.判断是否满了
    public boolean isFull(){
        return length == arr.length;
    }

}

public class Test01 {
    public static void main(String[] args) {

        Quene quene = new Quene(5);
        quene.insert(1);
        quene.insert(2);
        quene.insert(3);  //不满的队列以 0 填充,但是长度不会因为填充的0而变长

        System.out.println("原队列: "+ Arrays.toString(quene.arr)); //原队列: [1, 2, 3, 0, 0]
        System.out.println("队列长度: "+ quene.length);      //队列长度: 3
        System.out.println("数组长度: "+ quene.arr.length);  //数组长度: 5
        System.out.println("是否为空: "+quene.isEmpty());    //是否为空: false
        System.out.println("是否为满: "+quene.isFull());      //是否为满: false
        System.out.println("查看数据: "+quene.peek());        //查看数据: 1
        System.out.println("删除数据: "+quene.romove());      //删除数据: 1

        //删除后数组不变: [1, 2, 3, 0, 0],因为队列删除只是把 front队头的位置++,标记后面的数据,而不是把原数据剔除
        System.out.println("删除后队列: "+ Arrays.toString(quene.arr));
        System.out.println("查看数据: "+quene.peek());  //2

    }
}

2.循环列队

在插入数据的时候,判断end队尾是否到达数组length-1的位置,是则初始化end=-1;
在删除数据的时候,判断front是否到达数据length的位置,是则初始化front=0;
目的: 在循环删除队列数据后任然可以插入新的数据,非循环队列在删除完队列数据后插入数据会报数组越界异常

public class CycleQuene {
    //队列底层也是数组
    long[] arr;
    //队列长度
    int length;
    //队头
    int front;
    //队尾
    int end;

    //构造方法
    public CycleQuene(){
        arr = new long[10];
        length=0;
        front=0;
        end=-1;
    }
    public CycleQuene(int size){
        arr = new long[size];
        length=0;
        front=0;
        end=-1;
    }

    //1.添加数据,从队列尾插入
    public void insert(long value){
        //循环队列判断队尾是否到达最后
        if (end == arr.length-1){
            end=-1;
        }
        arr[++end] = value;
        length++;
    }

    //2.删除数据,从队头开始
    public long romove(){
        long value= arr[front++];
        //循环队列判断队头是否到达末尾
        if (front==arr.length){
            front=0;
        }
        length--;            //长度减减
        return value; //把第一个数据移除,队头就会++
    }

    //3.查看数据,从队头查看
    public long peek(){
        return arr[front];
    }

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

    //5.判断是否满了
    public boolean isFull(){
        return length == arr.length;
    }
}

public class Test01 {
    public static void main(String[] args) {

        CycleQuene quene = new CycleQuene(3);
        quene.insert(1);
        quene.insert(2);
        quene.insert(3);

        //循环移除所有数据
        while (!quene.isEmpty()){
            System.out.println(quene.romove()+",");  //1,2,3,
        }

        //插入数据
        quene.insert(8);
        System.out.println(quene.peek());  //8

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值