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>
相关推荐
鸽鸽程序猿6 分钟前
【前端】CSS
前端·css
Ajiang28247353047 分钟前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
ggdpzhk7 分钟前
VUE:基于MVVN的前端js框架
前端·javascript·vue.js
盼海11 分钟前
排序算法(五)--归并排序
数据结构·算法·排序算法
幽兰的天空12 分钟前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
小曲曲1 小时前
接口上传视频和oss直传视频到阿里云组件
javascript·阿里云·音视频
学不会•2 小时前
css数据不固定情况下,循环加不同背景颜色
前端·javascript·html
EasyNTS3 小时前
H.264/H.265播放器EasyPlayer.js视频流媒体播放器关于websocket1006的异常断连
javascript·h.265·h.264
Theodore_10223 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
网易独家音乐人Mike Zhou4 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot