数据结构-03-栈

1-栈的结构和特点

先进后出,后进先出 是栈的特点;

从图中,我们看到A入栈先放入底部,然后依次B和C;出栈的顺序依次是C-B-A;这种结构只能在一端操作。所以当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出(last-in-first-out(LIFO) )、先进后出的特性,我们就应该首选"栈"这种数据结构

2-栈的实现

我们可以使用数组和链表来实现栈,下面我们基于数组来现实一个基础功能的栈。

java 复制代码
@Getter
@Setter
public class MyArrayStack {

    private Object[] elementData;//存储元素的数组
    private int elementCount;//元素的个数
    private int capacity;//容量

    public MyArrayStack(int capacity) {
        this.elementData = new Object[capacity];
        this.capacity = capacity;
        this.elementCount = 0;
    }

    // 入栈操作
    public boolean push(Objectitem) {
        if (elementCount == capacity) return false;
        elementData[elementCount] = item;
        ++elementCount;
        return true;
    }

    // 出栈操作
    public Object pop() {
        if (elementCount == 0) return null;
        Object tmp = elementData[elementCount-1];
        --elementCount;
        return tmp;
    }
}


@Slf4j
public class TestStack {
    public static void main(String[] args) {
        MyArrayStack stack=new MyArrayStack(3);
        log.info("push1={}",stack.push("hello"));
        log.info("push2={}",stack.push("java"));
        log.info("push3={}",stack.push("world"));
        log.info("push4={}",stack.push("china"));
        log.info("pop1={}",stack.pop());
        log.info("pop2={}",stack.pop());
        log.info("pop3={}",stack.pop());
        log.info("pop4={}",stack.pop());
    }
}

控制台输出:

10:19:38.417 main INFO c.y.d.statck.TestStack - push1=true

10:19:38.423 main INFO c.y.d.statck.TestStack - push2=true

10:19:38.423 main INFO c.y.d.statck.TestStack - push3=true

10:19:38.424 main INFO c.y.d.statck.TestStack - push4=false

10:19:38.424 main INFO c.y.d.statck.TestStack - pop1=world

10:19:38.424 main INFO c.y.d.statck.TestStack - pop2=java

10:19:38.424 main INFO c.y.d.statck.TestStack - pop3=hello

10:19:38.424 main INFO c.y.d.statck.TestStack - pop4=null

当然上面代码是简易的栈实现:还有优化的空间,比如支持泛型,支持扩容等功能;可以自行实现。

入栈、出栈只涉及栈顶个别数据的操作,所以时间复杂度都是O(1)。

如何基于数组实现一个可以支持动态扩容的栈呢?当数组空间不够时,我们就重新申请一块更大的内存,将原来数组中数据统统拷贝过去。这样就实现了一个支持动态扩容的数组。Java中也有栈Stack实现的代码(支持泛型和扩容)。

3-栈的使用LeetCode

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 第20题,判断有效括号就可以使用栈这种结构来解决。

相关推荐
CSharp精选营14 小时前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假4 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠5 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦12 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠13 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾13 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82113 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q13 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒13 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记13 天前
单项不带头不循环链表
数据结构·链表