数组模拟栈和队列(图解流程)

版权声明:作者: 阿顾, 转载请写明出处, 谢谢 https://blog.csdn.net/u010452388/article/details/81567689

 

一 数组模拟栈

栈(stack),它是一种运算受限的线性表。这种限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底,向一个栈中插入新元素,我们一般称为入栈或者压栈,从一个栈中删除元素,我们一般称为弹栈或者出栈,即先进后出

入栈过程

首先声明一个固定大小的数组arr,并将索引index指向0位置,压入数据的时候,先给arr[index]赋值,再将index++

注意点:

如果index=arr.length的时候,用户要入栈,给用户抛出“栈已满”的异常(下图最右边的情况)


弹栈过程

用户调用弹栈的功能的时候,先将index--,然后再将arr[index]返回即可

注意点:

如果index=0的时候,用户要弹栈,给用户抛出“栈为空”的异常(下图最右边的情况)


如果用户只是要查看栈顶的数据,不是弹栈的话,只需要将arr[index-1]返回就行,但是不要添加index--功能(查看的时候,也需要先判断有没有数据,即index是否为0) 

代码

理解了上面的流程后,代码就比较容易理解了(友情提示:手机观看的话,下面代码可左右滑动


public class ArrayStack {
    //准备一个数组和一个指针
    private Integer[] arr;
    private Integer index;

    //构造函数
    public ArrayStack(int stackSize) {
        if (stackSize < 0) {
            throw new IllegalArgumentException("初始化大小不能小于0");
        }
        //初始化一个数组,并将指针指向索引0位置
        arr = new Integer[stackSize];
        index = 0;
    }
    //向栈中存入数据
    public void push(int num){
        if(index==arr.length){
            throw new IllegalArgumentException("栈已满");
        }
        arr[index]=num;
        index++;
    }
    //从栈中弹出数据
    public Integer pop(){
        if(index==0){
            throw new  IllegalArgumentException("栈目前为空");
        }
        index--;
        return arr[index];
    }
    //查看目前栈顶数据
    public Integer peek(){
        if(index==0){
            return null;
        }
        return arr[index-1];
    }

}

二 数组模拟队列

队列是只允许在表的前面进行删除操作,表的后面进行插入数据,也就是所谓的先进先出

图解过程

首先准备一个数组,以及一个first索引,last索引

插入新数据的时候,在last位置插入数据,并且将last++(first不动)


删除数据的时候,将arr[first]返回,并且将first++

注意: 

1、last来到数组末尾arr.length-1的时候,插入数据后,要将last=0,即回到数组索引0位置

2、first也是一样,到达arr.lenght-1时,删除数据后,也要将first=0

 从上面的流程可以感觉的出,first一直追着last,记住这种感觉哈

代码


public class ArrayQueue {

    private Integer[] arr;
    //这里size是用来判断队列目前的数据容量状况,为0,说明队列为空,为arr.length,说明队列满
    private Integer size;
    //用来指向当前队列的第一个数
    private Integer first;
    //用来指向当前队列的最后一个数
    private Integer last;

    //初始化队列
    public ArrayQueue(int queueSize) {
        if (queueSize < 0) {
            throw new IllegalArgumentException("初始化大小不能小于0");
        }
        arr = new Integer[queueSize];
        size = 0;
        first = 0;
        last = 0;
    }

    //插入新数据
    public void push(int num) {
        if (size == arr.length) {
            throw new IllegalArgumentException("队列已满");
        }
        //如果执行到这里,说明队列未满
        arr[last] = num;
        size++;
        //如果队列最后一个数到达数组末尾,
        // 用户还往队列里添加数据的话,则将索引指向数组0位置
        if (last == arr.length - 1) {
            last = 0;
        } else {
            last++;
        }
    }

    //弹出队列数据
    public Integer poll() {
        if (size == 0) {
            throw new IllegalArgumentException("队列为空");
        }
        //如果队列执行到这里,说明队列中还有数据
        int temp = first;
        size--;
        //如果队列第一个数到达数组末尾,
        // 用户还从队列中拿数据的话,则将索引指向数组0位置
        if (first == arr.length - 1) {
            first = 0;
        } else {
            first++;
        }
        return arr[temp];
    }

    public Integer peek() {
        if (size == 0) {
            return null;
        }
        return arr[first];
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/u010452388/article/details/81567689