数据结构之栈

什么是栈

栈是一种常用的数据结构,其数据存储使用的是逻辑结构。逻辑结构是一个比较抽象的概念,它依赖于物理结构而存在。逻辑结构又分为线性结构和非线性结构。比如顺序表表、栈和队列等就是典型的线性结构,而树和图等就是非线性结构。

栈(Stack)是一种线性数据结构,它就像一个单通道的容器,其中的元素只能先进后出(First In Last Out,简称 FILO)。由于其是单通道的,所以决定了最早进入容器的元素只能最晚出。最早进入的元素存放的位置叫做栈底,最后进入的元素存放的位置叫做栈顶。像栈这种线性结构既可以用数组来实现,也可以用链表来实现。

数组实现如下:

数据结构之栈_第1张图片

链表实现如下:

数据结构之栈_第2张图片

栈的基本操作

1.入栈

入栈操作(push)就是把新元素放入栈中,只允许从栈顶一侧放入元素,新元素的位置将会称为新的栈顶。

数据结构之栈_第3张图片

 如图所示,已经栈中已有元素3、5、1、4、9、6,其中 3 为栈底元素,6 为栈顶元素,此时有元素 7 需要入栈,那么入栈之后的栈顶元素就变成了 7。

2.出栈

出栈操作(pop),也叫弹栈操作,就是把元素从栈中弹出,只有栈顶元素才允许出栈,出栈之后,出栈元素的前一个元素将会成为新的栈顶元素。

数据结构之栈_第4张图片

如图所示,已知栈中已有元素3、5、1、4、9、6、7,其中 7 为栈顶元素,现在元素 7 想要出栈,那么出栈之后新的栈顶元素就是 6,栈底元素不变。

代码展示

栈的入栈和出栈相关代码代码如下:

package structure.stack;

/**
 * @ClassName: Stack
 * @Author: jiaomubai
 * @Date: 2022/1/30 14:55
 * @Description: 栈的出栈与入栈操作
 */
public class Stack {

    // 存储数据的数组
    private int[] dataArray;
    // 栈顶元素下标
    private int top;
    // 栈底元素下标
    private int bottom;

    public Stack(int capacity) {
        this.dataArray = new int[capacity];
    }

    /**
     * 入栈
     * @param element
     */
    public void push(Integer element) {
        System.out.println("入栈元素为:" + element);
        if (top == dataArray.length) {
            System.out.println("栈已满");
            return;
        }
        dataArray[top] = element;
        System.out.println("入栈之后栈顶元素为:" + dataArray[top]);
        System.out.println("入栈之后栈底元素为:" + dataArray[bottom]);
        top++;
        System.out.println();
    }

    /**
     * 出栈
     * @return
     */
    public Integer pop() {
        if (top == bottom) {
            System.out.println("栈已空");
            return -1;
        }
        Integer popElement = dataArray[--top];
        System.out.println("出栈元素为:" + popElement);
        if (top == -1) {
            System.out.println("出栈之后栈顶元素为:" + null);
            System.out.println("出栈之后栈底元素为:" + null);
        } else {
            System.out.println("出栈之后栈顶元素为:" + dataArray[top]);
            System.out.println("出栈之后栈底元素为:" + dataArray[bottom]);
        }
        System.out.println();
        return popElement;
    }

    /**
     * 打印
     */
    public void print() {
        for (int i = 0; i < top - 1; i++) {
            System.out.print(dataArray[i] + " --> ");
        }
        if (top == 0) {
            System.out.println("空栈");
        } else {
            System.out.println(dataArray[top - 1]);
        }
    }

    public static void main(String[] args) {
        Stack stack = new Stack(6);
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);
        stack.push(6);
        stack.push(7);
        System.out.println();
        stack.print();
        System.out.println();
        stack.pop();
        stack.pop();
        stack.pop();
        stack.print();
    }

}

数据结构之栈_第5张图片

以上代码是使用数组模拟的一个栈,实际使用时 Java 可直接调用 Stack 相关的 API 即可。如上代码所示,初始化栈时,栈中每个元素都是 0。每有一个元素入栈时,top 自增 1,每有一个元素出栈时,top 自减 1。代码仅供参考,只是实现了出栈和入栈操作,其他向获取栈顶元素等操作并未实现。

入栈和出栈只涉及最后一个元素,不涉及其他元素的整体移动,所以无论是以链表的形式实现,还是以数组的形式实现,入栈、出栈的时间复杂度都是 O(1)

你可能感兴趣的:(算法与数据结构,数据结构,栈)