数据结构——栈

本文详细介绍了数据结构中的栈,包括其“先进后出”特性、如何实现栈(顺序栈与链式栈)、动态扩容的顺序栈、栈在函数调用、内存管理、表达式求值和括号匹配中的应用。通过实例分析,揭示了栈在实际开发中的重要角色。

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

栈是一种数据结构,今天我们先来理解下栈的定义,然后再看几个在现实开发中运用到的实例。

1. 什么是栈?

栈是一个具有“先进后出、后进先出”这种特点的数据结构。

从栈的结构图中可以看出,栈是一种“操作受限”的线性表,只允许在一端插入或删除数据。

从功能上来说,数组或链表可以替代栈,但特定的数据结构是对应特定场景的抽象。当某个数据集合只涉及在一端插入和删除数据,并且满足先进后出、后进先出的特性时,这时候我们就可以选择栈这种数据结构。

2. 如何实现一个栈?

从上面栈的结构图中可以看到栈主要包含了两个操作:入栈和出栈。即在栈顶插入一个数据或删除一个数据。理解栈的定义后,我们就可以实现一个栈了。

数组和链表都可以用来实现栈。用数组实现的栈叫作“顺序栈”,用链表实现的栈叫作“链式栈”。

下面我分别用数组和链表来实现一个栈。

基于数组实现的顺序栈

public class ArrayStack {
  private String[] items;  // 数组
  private int count;       // 栈中元素个数
  private int n;           // 栈的大小

  // 初始化数组,申请一个大小为 n 的数组空间
  public ArrayStack(int n) {
    this.items = new String[n];
    this.n = n;
    this.count = 0;
  }

  // 入栈操作
  public boolean push(String item) {
    // 数组空间不够了,直接返回 false,入栈失败。
    if (count == n) return false;
    // 将 item 放到下标为 count 的位置,并且 count 加一
    items[count] = item;
    ++count;
    return true;
  }
  
  // 出栈操作
  public String pop() {
    // 栈为空,则直接返回 null
    if (count == 0) return null;
    // 返回下标为 count-1 的数组元素,并且栈中元素个数 count 减一
    String tmp = items[count-1];
    --count;
    return tmp;
  }
}

基于链表实现的链式栈

public class StackBasedLinkedList {
  private Node top = null;

  public void push(int value) {
    Node newNode = new Node(value, null);
    // 判断是否栈空
    if (top == nul
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值