python之数据结构与算法(数据结构篇)-- 栈


一、栈的概念

这里我们不去了解教科书上面的"教条概念",其实"栈"的概念和古代的时候的"客栈"是有异曲同工之妙的。

在这里我们把客栈看成"栈",旅客看作"栈元素"

1.当旅客进来住店时,叫做"入栈";

2.当旅客退房时,叫做"出栈";

3.当客栈里面都住满了旅客时,叫做"栈满";

4.当客栈里面一个旅客也没有的时候,叫做"栈空";

这里我们去创建一个"羊村栈",去进行操作演示整个过程,以别于更好理解


二、栈实现思路

1.初始化一个空列表用于存储"羊村栈"

python 复制代码
class sheep_village_stack:
    def __init__(self):
        self.sheep = []  # 初始化一个空列表用于存储"羊村栈"

2.检查栈是否为空

python 复制代码
def is_empty(self):
        return len(self.sheep) == 0  # 检查栈是否为空

3.添加一只羊到栈顶

python 复制代码
 def push(self, sheep):
        self.sheep.append(sheep)  # 添加一只羊到栈顶

4.移除并返回栈顶的羊

python 复制代码
def pop(self):
        if not self.is_empty():
            return self.sheep.pop()  # 移除并返回栈顶的羊
       

5.如果栈为空,则抛出异常

python 复制代码
 else:
            raise IndexError("羊村小栈为空")  # 如果栈为空,则抛出异常

6.返回栈顶的羊,但不移除它

python 复制代码
def peek(self):
        if not self.is_empty():
            return self.sheep[-1]  # 返回栈顶的羊,但不移除它

7.如果栈为空,则抛出异常

python 复制代码
else:
            raise IndexError("羊村小栈为空")  # 如果栈为空,则抛出异常

8.返回栈中羊的数量

python 复制代码
def size(self):
        return len(self.sheep)  # 返回栈中羊的数量

9.创建一个羊村小栈实例

python 复制代码
# 创建一个羊村小栈实例
stack = sheep_village_stack()

10.加入喜羊羊、美羊羊、慢羊羊

python 复制代码
# 加入喜羊羊、美羊羊、慢羊羊
stack.push('喜羊羊')
stack.push('美羊羊')
stack.push('慢羊羊')

11.输出当前栈的大小

python 复制代码
# 输出当前栈的大小
print("当前栈的大小:", stack.size())  # 应输出 3

12.查看栈顶的羊

python 复制代码
# 查看栈顶的羊
print("栈顶的羊是:", stack.peek())  # 应输出 '慢羊羊'

13.出栈操作

python 复制代码
# 出栈操作
print("出栈的羊是:", stack.pop())  # 应输出 '慢羊羊'
print("出栈的羊是:", stack.pop())  # 应输出 '美羊羊'

14.再次查看栈顶的羊

python 复制代码
# 再次查看栈顶的羊
print("现在栈顶的羊是:", stack.peek())  # 应输出 '喜羊羊'

15.最后出栈

python 复制代码
# 最后出栈
print("最后出栈的羊是:", stack.pop())  # 应输出 '喜羊羊'

16.尝试从空栈中出栈

python 复制代码
# 尝试从空栈中出栈
try:
    print(stack.pop())
except IndexError as e:
    print(e)  # 应输出 "羊村小栈为空"

三、python代码实现

python 复制代码
class sheep_village_stack:
    def __init__(self):
        self.sheep = []  # 初始化一个空列表用于存储"羊村栈"

    def is_empty(self):
        return len(self.sheep) == 0  # 检查栈是否为空

    def push(self, sheep):
        self.sheep.append(sheep)  # 添加一只羊到栈顶

    def pop(self):
        if not self.is_empty():
            return self.sheep.pop()  # 移除并返回栈顶的羊
        else:
            raise IndexError("羊村小栈为空")  # 如果栈为空,则抛出异常

    def peek(self):
        if not self.is_empty():
            return self.sheep[-1]  # 返回栈顶的羊,但不移除它
        else:
            raise IndexError("羊村小栈为空")  # 如果栈为空,则抛出异常

    def size(self):
        return len(self.sheep)  # 返回栈中羊的数量

# 创建一个羊村小栈实例
stack = sheep_village_stack()

# 加入喜羊羊、美羊羊、慢羊羊
stack.push('喜羊羊')
stack.push('美羊羊')
stack.push('慢羊羊')

# 输出当前栈的大小
print("当前栈的大小:", stack.size())  # 应输出 3

# 查看栈顶的羊
print("栈顶的羊是:", stack.peek())  # 应输出 '慢羊羊'

# 出栈操作
print("出栈的羊是:", stack.pop())  # 应输出 '慢羊羊'
print("出栈的羊是:", stack.pop())  # 应输出 '美羊羊'

# 再次查看栈顶的羊
print("现在栈顶的羊是:", stack.peek())  # 应输出 '喜羊羊'

# 最后出栈
print("最后出栈的羊是:", stack.pop())  # 应输出 '喜羊羊'

# 尝试从空栈中出栈
try:
    print(stack.pop())
except IndexError as e:
    print(e)  # 应输出 "羊村小栈为空"

四、HYTML可视化实现

效果展示

python 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>羊村角色栈的可视化</title>
<style>
  body {
    font-family: Arial, sans-serif;
    margin: 20px;
    text-align: center;
  }
  .container {
    max-width: 600px;
    margin: 0 auto;
    text-align: left;
  }
  .input-group {
    margin-bottom: 20px;
  }
  .input-group label {
    display: block;
    margin-bottom: 5px;
  }
  .input-group select {
    width: 100%;
    padding: 10px;
    font-size: 16px;
  }
  .input-group button {
    padding: 10px 20px;
    font-size: 16px;
    cursor: pointer;
  }
  .result-group {
    border: 2px solid #ccc;
    padding: 15px;
    background-color: #f9f9f9;
  }
  .result-item {
    margin-bottom: 10px;
  }
</style>
</head>
<body>
<h1>羊村角色栈的可视化</h1>

<div class="container">
  <div class="input-group">
    <label for="stackSelect">选择要入栈的角色:</label>
    <select id="stackSelect">
      <option value="喜羊羊">喜羊羊</option>
      <option value="美羊羊">美羊羊</option>
      <option value="沸羊羊">沸羊羊</option>
      <option value="懒羊羊">懒羊羊</option>
      <option value="暖羊羊">暖羊羊</option>
    </select>
    <button onclick="push()">入栈 (Push)</button>
  </div>

  <div class="input-group">
    <button onclick="pop()">出栈 (Pop)</button>
  </div>

  <div class="input-group">
    <button onclick="peek()">查看栈顶 (Peek)</button>
  </div>

  <div class="result-group">
    <h3>当前栈的状态</h3>
    <ul id="stackDisplay"></ul>
  </div>
</div>

<script>
// 初始化栈
let stack = [];

// 更新栈显示
function updateStackDisplay() {
  const stackDisplay = document.getElementById('stackDisplay');
  stackDisplay.innerHTML = '';
  for (let i = stack.length - 1; i >= 0; i--) {
    const li = document.createElement('li');
    li.textContent = stack[i];
    stackDisplay.appendChild(li);
  }
}

// 入栈操作
function push() {
  const value = document.getElementById('stackSelect').value;
  if (value) {
    stack.push(value);
    updateStackDisplay();
  } else {
    alert("请选择一个角色");
  }
}

// 出栈操作
function pop() {
  if (stack.length > 0) {
    stack.pop();
    updateStackDisplay();
  } else {
    alert("栈为空,无法出栈");
  }
}

// 查看栈顶操作
function peek() {
  if (stack.length > 0) {
    alert(`栈顶元素是: ${stack[stack.length - 1]}`);
  } else {
    alert("栈为空,没有栈顶元素");
  }
}
</script>

</body>
</html>
相关推荐
gang_unerry3 分钟前
量子退火与机器学习(4): 大模型 1-bit 量子化中的 QEP 与 QQA 准量子退火技术
人工智能·python·机器学习·量子计算
阿猿收手吧!6 分钟前
【C++】C++模板特化:精准定制泛型逻辑
开发语言·c++·算法
青瓷程序设计14 分钟前
【交通标志识别系统】python+深度学习+算法模型+Resnet算法+人工智能+2026计算机毕设项目
人工智能·python·深度学习
ghie909025 分钟前
MATLAB中编写不平衡磁拉力方程
开发语言·matlab
啥都想学点29 分钟前
关于制作技术视频讲解的问卷调查
python
喵手29 分钟前
Python爬虫实战:博物馆官网的“展览预告/正在热展”栏目,抓取展览名称、精确展期、具体展厅位置以及票务/预约规则(附CSV导出)!
爬虫·python·爬虫实战·零基础python爬虫教学·博物馆信息采集·采集展览预告/正在热展等·采集数据csv导出
喵手30 分钟前
Python爬虫实战:电商实体消歧完整实战 - 从混乱店铺名到标准化知识库的工程化实现,一文带你搞定!
爬虫·python·算法·爬虫实战·零基础python爬虫教学·同名实体消除·从混乱店铺名到标准化知识库
weixin_4521595534 分钟前
C++与Java性能对比
开发语言·c++·算法
会叫的恐龙38 分钟前
C++ 核心知识点汇总(第一日)(输入输出与变量、类型转换)
开发语言·c++
aluluka39 分钟前
Emacs折腾日记(三十六)——打造个人笔记系统
笔记·python·emacs