数据结构之栈

什么是栈

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

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

数组实现如下:

链表实现如下:

栈的基本操作

1.入栈

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

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

2.出栈

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

如图所示,已知栈中已有元素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();
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值