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

栈是一种基本的数据结构,广泛应用于计算机科学和编程中,用于管理数据的存储和访问。栈遵循后进先出(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: 恋水无意


posted @   落雷  阅读(311)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2017-11-04 码海拾遗:strcpy()、strncpy()和strcpy_s()区别
点击右上角即可分享
微信分享提示