栈(Stack)的详解

目录

1.栈的概念

2.栈的模拟实现

1.栈的方法

2.模拟栈用(整型)数组的形式呈现

2.1栈的创建

2.2压栈

2.3栈是否为空

2.4出栈

2.5获取栈中有效元素个数

2.6获取栈顶元素

2.7完整代码实现

3.链表的栈使用


1.栈的概念

从上图中可以看到, Stack 继承了 Vector Vector ArrayList 类似,都是动态的顺序表,不同的是 Vector 是线程安 全的。
(1)栈 :一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO Last In First Out )的原则。
(2)压栈:栈的插入操作叫做进栈 / 压栈 / 入栈, 入数据在栈顶
(3)出栈:栈的删除操作叫做出栈。 出数据在栈顶
总结:先进后出

2.栈的模拟实现

1.栈的方法

2.模拟栈用(整型)数组的形式呈现

2.1栈的创建

public class MyStack {
    public int[] arr;
    public int size;
    public MyStack() {
        this.arr = new int[10];
    }
}

2.2压栈

(1)首先对现有栈进行判断是否为满,若满则需要进行扩容

  扩容:

private void ensureCapacity(){
        if(size==arr.length)
        {
            arr= Arrays.copyOf(arr,size*2);
        }
    }

(2)向数组添加

public int push(int x){
    ensureCapacity();
    arr[size++]=x;
    return x;
}

2.3栈是否为空

public boolean empty(){
        return 0 == size;
    }

2.4出栈

(1)首先得判断栈是否为空,若为空我们需要抛出异常

自定义一个异常为EmptyException如下:

public class EmptyException extends RuntimeException{
    public EmptyException() {
    }

    public EmptyException(String message) {
        super(message);
    }
}

(2)合法出栈

public int pop() {
        if(empty()) {
            throw new EmptyException("栈是空的!");
        }
        return arr[--size];
    }

2.5获取栈中有效元素个数

 public int size(){
        return size;
    }

2.6获取栈顶元素

 public int peek(){
        if(empty()) {
            throw new EmptyException("栈是空的!");
        }
        return arr[size-1];
    }

2.7完整代码实现

import java.util.Arrays;

public class MyStack {
    public int[] arr;
    public int size;
    public MyStack() {
        this.arr = new int[10];
    }
    private void ensureCapacity(){
        if(size==arr.length)
        {
            arr= Arrays.copyOf(arr,size*2);
        }
    }
    public int push(int x){
        ensureCapacity();
        arr[size++]=x;
        return x;
    }
    public boolean empty(){
        return 0 == size;
    }
    public int pop() {
        if(empty()) {
            throw new EmptyException("栈是空的!");
        }
        return arr[--size];
    }
    public int size(){
        return size;
    }
    public int peek(){
        if(empty()) {
            throw new EmptyException("栈是空的!");
        }
        return arr[size-1];
    }
}

EmptyException

public class EmptyException extends RuntimeException{
    public EmptyException() {
    }

    public EmptyException(String message) {
        super(message);
    }
}

3.链表的栈使用

(1)单链表:

从头部插入(入栈),从从头部删除(出栈)

时间复杂度为O(1);

(2)双向链表:

可以从头部插入(入栈),从从头部删除(出栈)

也可以从尾部插入(入栈),从从尾部删除(出栈)

时间复杂度为O(1);

LinkedList自带实现方法:

public static void main(String[] args) {
        LinkedList<Integer> linkedList = new LinkedList<>();
        linkedList.push(1);
        linkedList.push(2);
        linkedList.push(3);
        linkedList.push(4);
        System.out.println(linkedList.peek());
        System.out.println(linkedList.pop());
        System.out.println(linkedList.pop());

    }

运行结果:


以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

 

猜你喜欢

转载自blog.csdn.net/WHabc2002/article/details/132676105