[Data structure]栈

这篇具有很好参考价值的文章主要介绍了[Data structure]栈。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现,有时候有C/C++代码。
⭐如果觉得文章写的不错,欢迎点个关注一键三连😉有写的不好的地方也欢迎指正,一同进步😁

1、简介

  栈(Stack)是一种常见的数据结构,它遵循"先进后出"(Last-In-First-Out,LIFO)的原则。栈的操作主要包括入栈(Push)和出栈(Pop)两种基本操作,其中入栈将元素放入栈的顶部,而出栈则从栈的顶部移除元素。
  栈可以想象成一叠盘子,每当放入一个新的盘子时,它就被放在上面,而当需要取出盘子时,也是从上面开始取。因此,最后放入的盘子会最先被取出。

2、栈的特点

  1. LIFO原则:栈遵循"后进先出"的原则,最后放入的元素会首先被访问和移除。
  2. 限定访问位置:栈只允许在栈顶进行插入和删除操作,无法直接访问或修改栈底的元素。
  3. 时间复杂度:入栈和出栈操作的时间复杂度为O(1),即常数时间。

栈的实现可以基于数组或链表。使用数组实现的栈称为顺序栈(Sequential Stack),使用链表实现的栈称为链式栈(Linked Stack)。

以下是栈的基本操作:

  1. Push(入栈):将元素添加到栈的顶部。如果栈已满,可能会发生栈上溢(Stack Overflow)的错误。
  2. Pop(出栈):从栈的顶部移除一个元素,并返回该元素的值。如果栈为空,可能会发生栈下溢(Stack Underflow)的错误。
  3. Top/Peek(查看栈顶元素):返回栈顶元素的值,但不移除它。
  4. isEmpty(判断栈是否为空):检查栈是否为空,如果为空则返回True,否则返回False。
  5. isFull(判断栈是否为满):检查栈是否为满,如果为满则返回True,否则返回False。

3、应用场景

栈在计算机科学和软件工程中有广泛的应用,例如:

  1. 函数调用栈:用于跟踪函数的调用顺序和局部变量的存储。
  2. 表达式求值:使用栈来处理中缀表达式转换为后缀表达式,并计算表达式的值。
  3. 撤销操作:在文本编辑器、图形操作等应用中,使用栈来存储操作历史,以便撤销先前的操作。
  4. 浏览器历史记录:浏览器使用栈来存储访问过的网页,使得用户可以通过后退按钮按照访问的顺序导航。
  5. 深度优先搜索(DFS):在图算法中,栈用于实现深度优先搜索算法的追踪回溯。

栈是一种简单而强大的数据结构,可以通过合理应用栈来解决各种问题,同时也为其他复杂的数据结构和算法提供了基础支持。

4、代码实现

4.1、思路分析

  1. Push(压栈):将元素添加到栈的顶部。top++;
  2. Pop(弹栈):从栈的顶部移除一个元素,并返回该元素的值。top–;
  3. top(栈顶指针):初始值为-1。
  4. isEmpty(判断栈是否为空):检查栈是否为空,如果为空则返回True,否则返回False。
  5. isFull(判断栈是否为满):检查栈是否为满,如果为满则返回True,否则返回False。
      [Data structure]栈

4.2、Stack

Java

[Data structure]栈文章来源地址https://www.toymoban.com/news/detail-459745.html

package stack;

/**
 * @author 逐梦苍穹
 * @date 2023/5/25 20:34
 */
public class Stack<T> {
    private final int maxSize;
    private final Object[] stack;
    private int top = -1;

    public Stack(int maxSize) {
        this.maxSize = maxSize;
        this.stack = new Object[this.maxSize];
    }

    /**
     * 栈满
     */
    public boolean isFull(){
        return (top == maxSize - 1);
    }

    /**
     * 栈空
     */
    public boolean isEmpty(){
        return (top == -1);
    }

    /**
     * 压栈
     */
    public void push(T value){
        if (isFull()){
            System.out.println("栈满");
        }
        top++;
        stack[top] = value;
    }

    /**
     * 弹栈
     */
    public Object pop(){
        if (isEmpty()){
            System.out.println("栈空");
        }
        Object value = stack[top];
        stack[top] = null;
        top--;
        return value;
    }

    /**
     * 显示栈的内容
     */
    public void showStack(){
        //从栈顶遍历,但是不是弹栈
        if(!isEmpty()) {
            for(int i = top; i >= 0 ; i--) {
                System.out.printf("stack[%d]=%d\n", i, stack[i]);
            }
        }else {
            System.out.println("栈空");
        }
    }
}

C++

#include <vector>
#include <stdexcept>

template <typename T>
class Stack {
private:
    std::vector<T> stack; // 用vector作为底层存储结构

public:
    // 构造函数
    Stack() : stack(std::vector<T>()) {
    }

    // 入栈操作
    void push(T item) {
        stack.push_back(item);
    }

    // 出栈操作
    T pop() {
        if (isEmpty()) {
            throw std::out_of_range("Stack is empty");
        }
        T item = stack.back();
        stack.pop_back();
        return item;
    }

    // 查看栈顶元素
    T peek() {
        if (isEmpty()) {
            throw std::out_of_range("Stack is empty");
        }
        return stack.back();
    }

    // 判断栈是否为空
    bool isEmpty() {
        return stack.empty();
    }

    // 获取栈的大小
    int size() {
        return stack.size();
    }
};

到了这里,关于[Data structure]栈的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Data structure]队列&环形队列 | 一文带你彻底搞懂队列和环形队列(内附详细图解和代码实现)

    ⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:@逐梦苍穹 ⭐所属专栏:数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现 ⭐如果觉得文章写的不错,欢迎点个关注一键三连😉有写的不好的地方也欢迎指正,一同进步😁

    2023年04月17日
    浏览(102)
  • 【论文阅读】GPT4Graph: Can Large Language Models Understand Graph Structured Data?

    作者:Jiayan Guo, Lun Du, Hengyu Liu 文章链接:GPT4Graph: Can Large Language Models Understand Graph Structured Data? An Empirical Evaluation and Benchmarking 代码链接:GPT4Graph: Can Large Language Models Understand Graph Structured Data? An Empirical Evaluation and Benchmarking 通过使用自然语言描述图并向LLM提供文本描述,直接

    2024年01月20日
    浏览(44)
  • 使用八叉树模拟水和烟雾 Simulating Water and Smoke with an Octree Data Structure 论文阅读笔记

    原文: Losasso, Frank, Frédéric Gibou, and Ron Fedkiw. “Simulating water and smoke with an octree data structure.” Acm siggraph 2004 papers. 2004. 457-462. 这篇文章扩展了 [Popinet 2003] 的工作,拓展到表面自由流,并且使得八叉树不受限制 自适应网格划分的一个缺点是,它的模板不是均匀的,进而导致泊

    2024年02月19日
    浏览(45)
  • Structured Concurrency:结构化并发

    https://ericniebler.com/2020/11/08/structured-concurrency/ 是什么:一种确保子操作在父操作之前完成的方式,类似函数在调用函数之前完成。 最典型的结构化并发:C++20的协程 意义:它通过使异步生存期与普通C++词法作用域相对应,为异步程序带来了现代C++风格,并且不需要引用计数(

    2024年02月05日
    浏览(58)
  • Spark Structured Streaming使用教程

    Structured Streaming是一个基于Spark SQL引擎的可扩展和容错流处理引擎,Spark SQL引擎将负责增量和连续地运行它,并在流数据继续到达时更新最终结果。 Structured Streaming把持续不断的流式数据当做一个不断追加的表,这使得新的流处理模型与批处理模型非常相似。您将把流计算表

    2024年02月03日
    浏览(56)
  • 结构化流(Structured Streaming)

    有界数据: 无界数据: 结构化流是构建在Spark SQL处理引擎之上的一个流式的处理引擎,主要是针对无界数据的处理操作。对于结构化流同样也支持多种语言操作的API:比如 Python Java Scala SQL … Spark的核心是RDD。RDD出现主要的目的就是提供更加高效的离线的迭代计算操作,RDD是针

    2024年01月17日
    浏览(57)
  • Builder Pattern —— Structure Class

    建造者模式又称为 生成器模式 ,主要用于对复杂对象的构建、初始化,它可以 将多个简单的组件对象按顺序一步步组装起来 , 最终构建成一个复杂的成品对象 。 与工厂系列模式不同的是,建造者模式的主要目的在于把烦琐的 构建过程 从不同对象中抽离出来,使其脱离并

    2024年02月10日
    浏览(35)
  • 结构型模式(Structural Pattern)

    模式介绍 结构型模式(Structural Pattern)的主要目的就是 将不同的类和对象组合在一起,形成更大或者更复杂的结构体 。该模式并不是简单地将这些类或对象摆放在一起,而是要 提供它们之间的关联方式 。不同的结构型模式从不同的角度来组合类或对象,它们尽可能满足各

    2024年02月03日
    浏览(37)
  • [Date structure]时间/空间复杂度

    ⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:@逐梦苍穹 ⭐所属专栏:数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现,有时候有C/C++代码。 ⭐如果觉得文章写的不错,欢迎点个关注一键三连😉有写的不好的地方也欢

    2023年04月12日
    浏览(21)
  • Structured_Streaming和Kafka整合

    默认情况下,Spark的结构化流支持多种输出方案: File Sink foreach sink 允许对输出的数据进行任意的处理操作,具体如何处理由用户自定义函数决定。对输出的数据一个个进行处理操作。 使用方式主要有二种 方式一: 方式二:这种方式的适用场景是需要和资源打交道的情况(

    2024年01月19日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包