Java数据结构-栈的实现

本文介绍了栈的概念、实现思路及代码实现。栈是一个先进后出的数据结构,常用于中缀表达式转换、逆波兰计算器等。文中通过数组模拟栈,并提供了压栈、弹栈、判断栈满和空的方法。此外,还展示了完整的Java代码实现。

前言:

         嘻嘻,今天博主终于要更新栈的知识了,上次结束说要更新要是上一次,所以这次咱就把栈的实现的更新带来了,嗯~ o(* ̄▽ ̄*)o小伙伴可能会问,栈能干什么啊,在Java中栈不是有对应的类吗....

         栈能够实现逆波兰计算机,中缀表达式转后缀表达式,还有普通中缀计算机等.....

         话不多说,我们就从一下几个方面开始吧

        栈的概念 🔜 栈的实现思路 🔜 栈的代码实现与分析 🔜 结论 

        如果喜欢作者的话,戳这

        往期精彩:
        普通队列与环形队列


栈的概念: 

  1.  栈是一个先进后出,后进先出的有序列表
  2.  在栈中添加元素和删除元素都在一端执行,是一个特殊的线性表
  3.  插入元素或删除元素的一端是活跃的一端,被称为栈顶
  4.  另一端不活跃,被称为栈底
  5.  常用术语:压栈=入栈=push 出栈=弹栈=pop

 栈的实现思路:

  •  我们需要创建一个数组去模拟栈
  •  定义一个栈顶变量top,用于指向栈顶
  •  定义压栈弹栈等方法

 栈的代码实现与分析:

  • 创建一个数组及其变量模拟栈 

    private int maxSize;
    private int top;
    private Object[] stack;

    public ArraysStack(int maxSize) {
        this.maxSize = maxSize;
        this.top = -1;
        stack = new Object[maxSize];
    }

 代码分析:

  •  maxSize是栈的最大容量,在调用构造方法的时候可以自行指定
  •  top用于指向栈顶的变量,应该被初始化为-1
  •  这里选用了Object[]数组,目的是什么都可以放进去

图解: 

 

  •  创造两个方法,分别判断是否已满或已空

public boolean isFull() {
        return top == maxSize - 1;
    }
public boolean isEmpty() {
        return top == -1;
    }

 代码分析: 

图解: 

  •  创建一个压栈和弹栈的方法

public void push(E element) {
        if(isFull()) {
            System.out.println("栈已满,无法压栈");
            return;
        }
        stack[++top] = element;
    }
public E pop() throws Exception{
        if(isEmpty()) {
            throw new Exception("栈已空,无法弹栈");
        }
        return (E)stack[top--];
    }

  代码分析: 

  • 加入元素和取出元素之前,要分别分析一下栈是否为空,或是否为满,要有校验意识
  • 因为top初始化为-1,所以添加元素的时候应该先要自增,再添加
  • 因为top指向栈顶元素,所以取出元素时,先取出,栈顶top变量再自减 

 图解: 

 

  •  创建一个遍历的方法

public void print() {
        if(isEmpty()){
            System.out.println("栈已空,无法输出");
            return;
        }
        for (int i = top; i >= 0; i--) {
            System.out.println("stack[" + i + "] = " + stack[i]);
        }
    }

   代码分析: 

  1. 从栈的定义得知,先拿出来的是栈顶元素,所以应该从top开始,到0结束  

 完整代码:

package datastructure.chapter02.stack.instance;

/**
 *
 * @param <E> 指定栈存储的元素
 */
public class ArraysStack<E> {
    private int maxSize;
    private int top;
    private Object[] stack;

    /**
     * 栈(数组实现)的构造方法
     * @param maxSize 栈空间的最大值
     */
    public ArraysStack(int maxSize) {
        this.maxSize = maxSize;
        this.top = -1;
        stack = new Object[maxSize];
    }

    /**
     *  判断栈是否为满
     * @return 若返回值为true,则栈已满,否则为false
     */
    public boolean isFull() {
        return top == maxSize - 1;
    }

    /**
     *  判断栈是否为空
     * @return 若返回值为true,则栈已空,否则为false
     */
    public boolean isEmpty() {
        return top == -1;
    }

    /**
     * @param element 压入栈的数据
     */
    public void push(E element) {
        if(isFull()) {
            System.out.println("栈已满,无法压栈");
            return;
        }
        stack[++top] = element;
    }

    /**
     *
     * @return 返回栈顶数据
     * @throws Exception 空栈异常
     */
    public E pop() throws Exception{
        if(isEmpty()) {
            throw new Exception("栈已空,无法弹栈");
        }
        return (E)stack[top--];
    }

    /**
     * 输出栈
     */
    public void print() {
        if(isEmpty()){
            System.out.println("栈已空,无法输出");
            return;
        }
        for (int i = top; i >= 0; i--) {
            System.out.println("stack[" + i + "] = " + stack[i]);
        }
    }
}

 结论:

        栈的知识点简单又重要,代码不多,理解起来也不难,我来总结一下重要的几点:

        栈顶top的初始化赋值

        栈的压栈和弹栈的方法

        🚇下一站:双向链表!!!

### 使用单调算法求解最大矩形面积 #### 直方图最大矩形面积分析 对于给定的一系列高度不同的直方图柱子,目标是从这些柱子中找到能够构成的最大矩形面积。这个问题可以通过单调方法高效解决。 考虑一个具体的例子:假设存在一组高度分别为 `2, 1, 5, 6, 2, 3` 的直方图柱子[^2]。为了计算这组柱子所能形成的最大矩形面积,可以采用单调的方法来进行处理。 #### 单调法过程 定义单调的行为(以单增为例): - **入**:当为空时,直接将当前元素压入;如果不为空,则比较顶元素与待插入元素大小关系。只有当顶元素严格小于新加入的元素时才允许其进入内;反之则不断弹出顶直至满足条件为止。 - **出、取顶、判空等操作均遵循常规的操作逻辑** 通过上述方式构建起来的就是所谓的“单调递增”。每当遇到一个新的柱体时,会尝试将其作为新的边界去扩展已有的矩形区域,并更新全局最优解。 具体来说,在遍历过程中维护这样一个性质良好的结构可以帮助快速定位到左侧最近的小于等于当前位置高度的位置以及右侧最接近的大于当前位置高度的地方,从而方便地算出以该位置为高的矩形可能达到的最大宽度并进一步得出面积[^3]。 #### 示例代码示例 以下是使用Python编写的基于单调求解直方图中最大矩形面积的函数实现: ```python def largestRectangleArea(heights): stack = [] max_area = i = 0 while i < len(heights): # 如果为空或当前高度大于顶索引对应的高度,则将当前索引入 if not stack or heights[i] >= heights[stack[-1]]: stack.append(i) i += 1 else: top = stack.pop() height = heights[top] width = i if not stack else (i - stack[-1] - 1) max_area = max(max_area, height * width) # 清理剩余未处理的内元素 while stack: top = stack.pop() height = heights[top] width = i if not stack else (i - stack[-1] - 1) max_area = max(max_area, height * width) return max_area ``` 这段程序首先初始化了一个空列表用于模拟的功能,并设置两个变量分别记录最终的结果(`max_area`)和当前正在考察的下标(`i`)。接着在一个循环体内交替执行两种主要动作之一—要么把符合条件的新节点推入底端(即增加),要么从顶端移除旧有成员的同时评估由它们界定出来的潜在候选方案的价值(即减少)—直到整个序列都被扫描完毕为止。最后一步则是针对那些仍然留在队列里的残留项做同样的事情,确保不会遗漏任何可能性[^4]。
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爪哇土著、JOElib

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值