微信登录

栈 - 栈的实现 - 顺序栈与链式栈的实现

栈 - 栈的实现 - 顺序栈与链式栈的实现

一、栈的基本概念

栈(Stack)是一种特殊的线性数据结构,遵循后进先出(Last In First Out,LIFO)的原则。这就好比一摞盘子,最后放上去的盘子总是最先被拿走。栈有两个主要的操作:入栈(Push)和出栈(Pop)。入栈是将元素添加到栈的顶部,而出栈则是从栈的顶部移除元素。此外,还有一个查看栈顶元素的操作叫做 peek。

二、顺序栈的实现

1. 原理

顺序栈使用数组来实现栈的功能。通过一个指针(通常称为栈顶指针)来记录栈顶元素的位置。当进行入栈操作时,栈顶指针向上移动;出栈操作时,栈顶指针向下移动。

2. 代码实现(Python)

  1. class SeqStack:
  2. def __init__(self, max_size=100):
  3. # 初始化栈,使用列表存储元素
  4. self.max_size = max_size
  5. self.stack = [None] * max_size
  6. self.top = -1
  7. def is_empty(self):
  8. # 判断栈是否为空
  9. return self.top == -1
  10. def is_full(self):
  11. # 判断栈是否已满
  12. return self.top == self.max_size - 1
  13. def push(self, item):
  14. # 入栈操作
  15. if self.is_full():
  16. print("Stack is full")
  17. return
  18. self.top += 1
  19. self.stack[self.top] = item
  20. def pop(self):
  21. # 出栈操作
  22. if self.is_empty():
  23. print("Stack is empty")
  24. return None
  25. item = self.stack[self.top]
  26. self.top -= 1
  27. return item
  28. def peek(self):
  29. # 查看栈顶元素
  30. if self.is_empty():
  31. print("Stack is empty")
  32. return None
  33. return self.stack[self.top]
  34. # 测试顺序栈
  35. stack = SeqStack()
  36. stack.push(1)
  37. stack.push(2)
  38. stack.push(3)
  39. print(stack.pop()) # 输出 3
  40. print(stack.peek()) # 输出 2

3. 优缺点

优点 缺点
实现简单,使用数组存储元素,访问速度快 栈的大小在初始化时确定,可能会造成空间浪费或不足

三、链式栈的实现

1. 原理

链式栈使用链表来实现栈的功能。链表的每个节点包含一个数据元素和一个指向下一个节点的指针。栈顶元素位于链表的头部,入栈操作相当于在链表头部插入一个新节点,出栈操作相当于删除链表头部的节点。

2. 代码实现(Python)

  1. class Node:
  2. def __init__(self, data):
  3. # 初始化节点,包含数据和指向下一个节点的指针
  4. self.data = data
  5. self.next = None
  6. class LinkedStack:
  7. def __init__(self):
  8. # 初始化栈,栈顶指针初始化为 None
  9. self.top = None
  10. def is_empty(self):
  11. # 判断栈是否为空
  12. return self.top is None
  13. def push(self, item):
  14. # 入栈操作
  15. new_node = Node(item)
  16. new_node.next = self.top
  17. self.top = new_node
  18. def pop(self):
  19. # 出栈操作
  20. if self.is_empty():
  21. print("Stack is empty")
  22. return None
  23. item = self.top.data
  24. self.top = self.top.next
  25. return item
  26. def peek(self):
  27. # 查看栈顶元素
  28. if self.is_empty():
  29. print("Stack is empty")
  30. return None
  31. return self.top.data
  32. # 测试链式栈
  33. stack = LinkedStack()
  34. stack.push(1)
  35. stack.push(2)
  36. stack.push(3)
  37. print(stack.pop()) # 输出 3
  38. print(stack.peek()) # 输出 2

3. 优缺点

优点 缺点
栈的大小可以动态调整,不会造成空间浪费 每个节点需要额外的指针域,增加了空间开销;链表节点的内存地址不连续,访问速度相对较慢

四、顺序栈与链式栈的选择

  • 空间固定且较小:如果栈的大小在使用过程中不会发生太大变化,并且需要快速访问元素,那么顺序栈是一个不错的选择。例如,在一些嵌入式系统中,内存资源有限,栈的大小可以提前确定,使用顺序栈可以更有效地利用内存。
  • 空间动态变化:如果栈的大小在使用过程中会动态变化,那么链式栈更合适。例如,在一个表达式求值的程序中,需要处理不同长度的表达式,栈的大小无法提前确定,使用链式栈可以避免空间浪费或不足的问题。

栈是一种非常重要的数据结构,顺序栈和链式栈是栈的两种常见实现方式。通过了解它们的原理、优缺点和适用场景,我们可以根据具体的需求选择合适的实现方式。

栈 - 栈的实现 - 顺序栈与链式栈的实现