数据结构之栈

本文详细介绍了栈的概念,包括它的基本操作如压栈、出栈和获取栈顶元素。栈是一种遵循后进先出原则的数据结构,文章中提到了两种实现方式:顺序栈和链栈。在Java中,顺序栈通常基于数组实现,而链栈则使用链表。对于顺序栈,文章给出了判断栈满和栈空的方法,以及入栈和出栈的操作实现。讨论了链栈的效率,指出头插法实现链栈具有更高的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 概念

一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈
顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据在栈顶。

2 底层继承

如下图所示,Java中的Stack继承于Vctor,但是Vector在Java已经过时了,我们现在用的是栈,他的底层是一个数组,所以由此又可以分为顺序栈链栈
在这里插入图片描述

3 顺序栈

  • 判断栈满
public boolean empty(){
        return this.top == 0;
    }
  • 判断栈空
public boolean isFull(){
        return this.elem.length == this.top;
    }
  • 入栈操作
public void push(int item) {
        //1、判断当前栈是否是满的
        if(isFull()){
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length); //扩容
        }
        //2、elem[top] = item  top++;
        this.elem[this.top++] = item;
    }
  • 出栈操作
public int pop() {
        if(empty()) {
            throw new UnsupportedOperationException("栈为空!");
        }
        int ret = this.elem[this.top-1];
        this.top--;//真正的改变了top的值
        return ret;
    }
  • 得到栈顶元素,但是不删除
public int peek() {
        if(empty()) {
            throw new UnsupportedOperationException("栈为空!");
        }
        //this.top--;//真正的改变了top的值
        return this.elem[this.top-1];
    }

4 链栈

Q:1.3中的栈是数组实现的,我们称其为顺序栈,那么换个思路,栈能否用链表来实现

如下图所示,分别是尾插法和头插法进行入栈操作创建的栈。我们分析一下这个过程,尾插法进行入栈操作时,每一次都要找栈顶元素入栈,也就是说需要遍历一次链表,所以时间复杂度为O(N),而头插法直接插到头节点前面即可,无需遍历,所以时间复杂度为O(1),由此得出结论:
采用头插法实现链表栈效率最高;在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值