首页 > 其他分享 >栈:数据结构中的后进先出(LIFO)容器

栈:数据结构中的后进先出(LIFO)容器

时间:2023-11-04 09:33:05浏览次数:28  
标签:LIFO items 元素 后进先出 实现 Push Stack 数据结构 stack

栈是一种基本的数据结构,广泛应用于计算机科学和编程中,用于管理数据的存储和访问。栈遵循后进先出(Last In, First Out,LIFO)原则,即最后放入栈的元素首先被取出。这种数据结构模拟了物理世界中的栈,如一堆书或一摞盘子。

栈的概念

栈是一个线性数据结构,具有以下关键特点:

  1. 后进先出(LIFO)原则: 最后进入栈的元素将首先出栈。
  2. 两个主要操作: 栈支持两个基本操作,即压栈(Push)和弹栈(Pop)。
  3. 栈顶: 位于栈顶的元素是最新加入栈的元素,是唯一一个可以访问的元素。
  4. 栈底: 位于栈底的元素是最早加入栈的元素,通常不直接访问。
  5. 限制大小: 栈可以有固定或动态大小,通常有容量限制。

栈的用途

栈在计算机科学中有广泛的应用,包括但不限于以下用途:

  1. 函数调用: 编程语言使用栈来管理函数的调用和返回地址,以便实现函数的嵌套调用。
  2. 表达式求值: 栈可以用于计算数学表达式,例如后缀表达式(逆波兰表达式)的求值。
  3. 浏览器历史: 浏览器使用栈来跟踪访问过的网页,以便用户可以使用“后退”按钮。
  4. 撤销功能: 许多应用程序使用栈来实现撤销和重做操作。
  5. 内存管理: 操作系统使用栈来管理进程的内存分配和释放。

栈的实现

栈可以通过数组或链表实现。每种实现方式都有其优点和缺点。

  1. 数组实现: 使用数组实现的栈具有固定大小,通常更快,因为数组的元素在内存中是连续存储的。然而,固定大小的数组栈可能会导致栈溢出。
  2. 链表实现: 使用链表实现的栈没有固定大小限制,因此更灵活,但在访问栈中的元素时需要遍历链表,性能略低于数组实现。

以下是用Go语言实现的简单栈的示例,使用切片实现:

package main

import (
    "fmt"
)

type Stack struct {
    items []int
}

func (s *Stack) Push(item int) {
    s.items = append(s.items, item)
}

func (s *Stack) Pop() int {
    if len(s.items) == 0 {
        panic("Stack is empty")
    }
    lastIndex := len(s.items) - 1
    item := s.items[lastIndex]
    s.items = s.items[:lastIndex]
    return item
}

func main() {
    stack := Stack{}
    stack.Push(1)
    stack.Push(2)
    stack.Push(3)

    fmt.Println(stack.Pop()) // 输出 3
    fmt.Println(stack.Pop()) // 输出 2
}

孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意


标签:LIFO,items,元素,后进先出,实现,Push,Stack,数据结构,stack
From: https://www.cnblogs.com/lianshuiwuyi/p/17808898.html

相关文章

  • 计算机数据结构
    数据结构一数据结构的物理存储结构只有两种:顺序存储和链式存储(像栈、队列、树、堆、图等都是从逻辑结构去抽象的映射到内存中,也是这两种物理组织形式)。二顺序存储如数组连续的固定长度的空间,通过下标就能快速找到。链式存储如二叉树、B树等,底层可能是不连......
  • 数据结构之链表
    1.简介链表(LinkedList)是一种基本的数据结构,用于表示一组元素,这些元素按顺序排列,每个元素都与下一个元素连接。与数组不同,链表的元素不是在内存中连续存储的,而是通过指针来连接的。链表由节点(Node)组成,每个节点包含两个主要部分:数据和指向下一个节点(或上一个节点,如果是双向链表)的......
  • 数据结构-栈
    一、概念1、栈的定义栈是仅限在表尾进行插入和删除的线性表。栈又被称为后进先出(LastInFirstOut)的线性表,简称LIFO。2、栈顶栈是一个线性表,我们把允许插入和删除的一端称为栈顶3、栈底和栈顶相对,另一端称为栈底二、接口1、可写接口(1)数据入栈栈的插入操作,叫做入栈,也可称为进栈、压......
  • 【数据结构】第一章——绪论(1)
    数据结构的基本概念大家好,今天开始,我将开始从原先的专心学习C语言调整到边学习C语言,边学习数据结构的相关内容。当然,在学习的过程中我也会将各个知识点通过博客记录下来并将自己对知识点的理解分享给大家。本章内容是数据结构的概述,我们可以通过对本章内容的学习,初步了解数据结构的......
  • 图的数据结构及基础算法
    图(Graph)这个数据结构在平时开发中遇到的比较少,但我认为它是十分重要的,因为从真实的世界中来看,很多东西都可以抽象为图的表示,比如人际关系,地理位置,天马行空的东西都可以抽象为图,所以它比链表等基础数据结构高级一点点,也比较复杂,属于非线性结构。数学中有一个图论的分支也是与其有......
  • 查找附近店铺(Redis GEO数据结构实现)
    附近店铺(RedisGEO数据结构实现)GEO数据结构GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。常见的命令有:GEOADD:添加一个地理空间信息,包含:经度(longitude)、纬度(latitude)、值(member)GEO......
  • 数据结构笔记
    数据结构刷题笔记Points线段树显然先对\(x\)离散用线段树维护区间最大值,查询在线段树上二分出最小的\(x\)用set维护每个\(x\)对应的\(y\),lower_bound即可......
  • 数据结构与算法 | 哈希表(Hash Table)
    哈希表(HashTable)在二分搜索中提到了在有序集合中查询某个特定元素的时候,通过折半的方式进行搜索是一种很高效的算法。那能否根据特征直接定位元素,而非折半去查找?哈希表(HashTable),也称为散列表,就是一种数据结构,用于实现键-值对的映射关系。它通过将键映射到特定的值(哈希值)来实现......
  • sizeof与各数据结构内存占用计算
    一、sizeof1.sizeof介绍sizeof会计算参数的数据类型所占字节数。注意事项:如果是数组类型(非vector),则会返回整个数组所占字节数。sizeof是运算符,在编译期间确定,因此无法计算动态分配的内存大小,如new等。2.实现方式获取type使用getTypeInfoChars(type)来计算字节......
  • 数据结构-ST表
    ST表的使用范围:1.处理静态数组的极值问题2.尾部增减数组的极值问题ST表的原理:1.预处理:ST表的中心思想是动态规划,我们规定数组Max[i][j]储存的是数组中从第i个元素开始,总共2^j个数字的极(大)值,区间末尾位置为i+2^j-1。输入数组时,直接输入到Max[i][0]上。输入完成后,花费......