python栈和队列

news2024/12/24 3:08:36

python栈和队列

  • 一、栈
    • 1. 栈的基本介绍
    • 2. 代码
    • 3. 基本操作
    • 4. 括号匹配问题
    • 5. 删除字符串所有相邻的重复项
    • 6. 出栈顺序是否合法
  • 二、队列
    • 1. 队列基本介绍
    • 2. 队列代码
    • 3. 队列基本操作
    • 4. 约瑟夫环-循环嵌套
    • 5. 约瑟夫环-队列1
    • 6. 约瑟夫环-队列2

一、栈

1. 栈的基本介绍

特点:先进后出 (last-in, first-out)

入栈:push()
出栈:pop()
栈顶:get_top()
栈中元素个数:size()
判断栈是否为空:empty()

2. 代码

class Stack():
    def __init__(self):
        self.stack = []

    def push(self, element): # 入栈
        self.stack.append(element)

    def pop(self): # 出栈
        return self.stack.pop()

    def empty(self):  # 判断栈是否为空
        return self.stack == []

    def size(self):  # 返回栈中元素数量
        return len(self.stack)

    def get_top(self):# 取栈顶元素
        if len(self.stack) > 0:
            return self.stack[-1]
        else:
            return None

3. 基本操作

在这里插入图片描述

4. 括号匹配问题

class Stack():
    def __init__(self):
        self.stack = []

    def push(self, element):
        self.stack.append(element)

    def pop(self):
        return self.stack.pop()

    def get_top(self):
        if len(self.stack) > 0:
            return self.stack[-1]
        else:
            return None

    def empty(self):
        return len(self.stack) == 0


def bracket(s):
    stack = Stack()
    if len(s) % 2 != 0:  # 如果括号可以匹配,那么数量一定为偶数
        return False
    for i in s:
        if i == '(':
            stack.push(')')
        elif i == '[':
            stack.push(']')
        elif i == '{':
            stack.push('}')
        elif stack.get_top() == i:
            stack.pop()
        elif stack.empty() or stack.get_top() != i:
            return False
    if stack.empty():
        return True
    else:
        return False


s = input(':')
print(bracket(s))

5. 删除字符串所有相邻的重复项

样例:

输入:"abbaca"
输出:"ca"

例如:
在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。

之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"
class Stack():
    def __init__(self):
        self.stack = []

    def push(self, element):
        self.stack.append(element)

    def pop(self):
        return self.stack.pop()

    def get_top(self):
        if len(self.stack) > 0:
            return self.stack[-1]
        else:
            return None

    def empty(self):
        return len(self.stack) == 0


def bracket(s):
    stack = Stack()
    for i in s:
        # 1. 如果栈为空 或者  前一个元素(栈顶)不等于当前元素i,则代表不是重复的,直接入栈即可
        if stack.empty() or stack.get_top() != i:
            stack.push(i)
        # 2. 如果前一个元素(栈顶) 等于 当前元素i,则需要出栈
        elif i == stack.get_top():
            stack.pop()
    # 3. 挨个遍历栈里面的元素,并加入到s中。注意:因为是从栈顶依次获取的,所有字符串s需要反转。
    s = ""
    while not stack.empty():
        s += stack.get_top()
        stack.pop()
    return s[::-1]


s = input(':')
print(bracket(s))

6. 出栈顺序是否合法

输入出栈的数字(数字不相同),判断这些数字是否可以合法入栈。

class Stack():
    def __init__(self):
        self.stack = []

    def push(self, element):
        self.stack.append(element)

    def pop(self):
        return self.stack.pop()

    def get_top(self):
        if len(self.stack) > 0:
            return self.stack[-1]
        else:
            return None

    def empty(self):
        return len(self.stack) == 0


# ① 创建栈,stack为栈中
stack = Stack()
# ② 创建数组a,为栈后数组
a = [0 for i in range(10)]
# ③ 输入数字
n = int(input('你要输入几个数字:'))
for i in range(1, n + 1):
    a[i] = int(input('请输入数字:'))
print(a)
# ④ 入栈、出栈
p = 1  # p表示栈前,p始终指向它即将入栈的那一位
flag = 1
for i in range(1, n + 1):
    while a[i] >= p:  # 将i之前的所有数字入栈
        stack.push(p)  # 入栈
        p += 1
    if stack.get_top() == a[i]:  # 如果栈顶 等于 列表第i为的元素,出栈
        stack.pop()  # 出栈
    else:
        flag = 0
        break
# ⑤ 判断是否合法
if flag:
    print(True)
else:
    print(False)

二、队列

1. 队列基本介绍

特点:先进先出 (First in,First out)

入队:push()。队尾(rear)指针加1。rear=(rear+1)%MaxSize
出队:pop()。  对头(front)指针加1。front=(front+1)%MaxSize
对头元素:get_front()
对尾元素:get_back()
队列中元素个数:length()(rear−front+MaxSize)%MaxSize
判断队是否为空:empty()。front==rear
判断队列是否满:filled()(rear+1)%MaxSize==front

2. 队列代码

class Queue:
    def __init__(self, size):
        self.queue = [0 for _ in range(size)]
        self.size = size  # 队列最大容量
        self.rear = 0  # 队尾,负责入队
        self.front = 0  # 队头,负责出队

    # 入队
    def push(self, element):
        if not self.filled():  # 如果队不满,则入队
            self.rear = (self.rear + 1) % self.size  # 将队尾指针重新赋值,队尾需要向后移动一位
            self.queue[self.rear] = element  # 队尾插入元素
        else:
            raise IndexError("队列已满!!!")

    # 出队
    def pop(self):
        if not self.empty():  # 如果队不空,则出队
            self.front = (self.front + 1) % self.size  # 将队头指针重新赋值,对头需要向后移动一位
            return self.queue[self.front]
        else:
            raise IndexError("队列为空!!!")

    # 判断队空(队头等于队尾则代表对空)
    def empty(self):
        return self.rear == self.front

    # 判断队满
    def filled(self):
        return (self.rear + 1) % self.size == self.front

    # 队列元素个数
    def length(self):
        return (self.rear - self.front + self.size) % self.size

    # 对头元素
    def get_front(self):
        if not self.empty():  # 如果队不空,则打印对头元素
            return self.queue[(self.front + 1) % self.size]

    # 对尾元素
    def get_back(self):
        if not self.empty():  # 如果队不空,则打印对尾元素
            return self.queue[self.rear]

3. 队列基本操作

# 1. 创建队列
q = Queue(5)
# 2. 依次添加数据
q.push(1)
q.push(2)
q.push(3)
q.push(4)
# 3. 出队列
print('出队:', q.pop())
print('出队:', q.pop())
# 4. 长度、对头、队尾
print('队列长度:', q.length())
print('对头元素:', q.get_front())
print('对尾元素:', q.get_back())

# ⑤ 遍历队列
# while not q.empty():
#     print(q.pop())

while not q.empty():
    print('对头元素:', q.get_front())
    q.pop()

4. 约瑟夫环-循环嵌套

一共有n个人,第m个人负责出圈,请依次打印出圈的数字。

a = [0 for i in range(101)]
n, m, i, cnt, k = 0, 0, 0, 0, 0  # cnt:出圈人数  i:位置,从1开始  k:数数,到k,就要出圈

n = int(input('一共有几个人?'))
m = int(input('第几个人出圈?'))

while cnt != n:
    i += 1
    if i > n:  # 走到了最后一个,再回头
        i = 1
    if a[i] == 0:  # 如果为0则代表这个数还没出圈
        k += 1
        if k == m:
            a[i] = 1  # 出圈
            cnt += 1  # 出圈人数增加1
            print(i, end=' ')
            k = 0  # 重新数数

5. 约瑟夫环-队列1

# 1. 创建队列
q = Queue(20)
n = int(input('一共有几个人?'))
m = int(input('第几个人出圈?'))
# 2. 将n个人的编号按顺序依次入队
for i in range(1, n + 1):
    q.push(i)
# 3. 从1开始报数10
cnt = 1
while not q.empty():  # 只要队列不为空则一直循环
    if cnt % m == 0:  # 代表找到了
        print(q.get_front(), end=' ')
        q.pop()
        cnt = 0
    else:  # 未找到
        q.push(q.get_front())  # 把队头元素调到队尾
        q.pop()
    cnt += 1

6. 约瑟夫环-队列2

# 1. 创建队列
q = Queue(20)
n = int(input('一共有几个人?'))
m = int(input('第几个人出圈?'))
# 2. 将n个人的编号按顺序依次入队
for i in range(1, n + 1):
    q.push(i)
# 3. 将第m个数字移到队首,第m-1个数字移到队尾
while q.length() > 0:      # 删除操作,并在当队列中没有数字时停止该操作
    for i in range(1, m):  # 将队列中第m个人移到队首,并将前面m-1个人按顺序排到队尾
        h = q.get_front()
        q.pop()
        q.push(h)
    x = q.pop()
    print(x, end=' ')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1106311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口测试经验合集

一 、接口测试常见问题 前景提要:由于本人测试小白,可能所遇问题都较为基础,测试小白可以参考 1.1 postman会报 connect ECONNREFUSED jemeter会报 org.apache.http.conn.HttpHostConnectException: Connect tofailed: Connection refus…

ASEMI-GBJ5010电源控制柜所用整流桥

编辑-Z 电源控制柜是一种常用的电力设备,广泛应用于工业生产过程中。在电源控制柜中,整流桥起着重要的作用。 整流桥是一种用于变流的电器元件,由4个二极管组成。它能够将交流电转换为直流电,并提供稳定的电源给控制柜中的其他设…

07 创建型模式-单例模式

1.单例模式介绍 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,此模式保证 某个类在运行期间,只有一个实例对外提供服务,而这个类被称为单例类。 2.使用单例模式要做的两件事 保证一个类只有一个实例…

C语言实现:有 5 个人坐在一起,问第 5 个人多少岁?

完整代码: /*有 5 个人坐在一起,问第 5 个人多少岁?他说比第 4 个人大两岁。间第 4 个人岁 数,他说比第 3 个人大两岁。问第 3 个人,又说比第 2 个人大两岁。问第 2 个人, 说比第 1 个人大两岁。最后问第 1 个人&…

Linux内核驱动开发:技能、应用和挑战

Linux内核驱动开发:技能、应用和挑战 Linux内核驱动开发所需技能包括C语言和汇编语言编程、Linux系统编程接口、内核原理和机制、设备驱动开发和调试技术等。同时,熟悉常用的开发环境和工具如GNU工具链、make、gcc、gdb等也是必要的。 Linux内核驱动开…

在华为和比亚迪干了5年测试,月薪25K,熬夜总结出来的划水经验.....

先简单交代一下背景吧,某不知名 985 的本硕,17 年毕业加入华为,之后跳槽到了比亚迪,一直从事软件测试的工作。之前没有实习经历,算是5年的工作经验吧。 这5年之间完成了一次晋升,换了一家公司,…

scada组态软件和硬件结构的主要功能

scada在工厂自动化领域有许多应用。在行业内,所有现场仪表都单独连接到接线盒。多对电缆将从接线盒连接到控制室。 在scada中,电缆被接收在编组柜中。这里,电缆分为模拟输入(AI)、模拟输出(AO)…

3D视觉基础

3D 视觉领域是计算机视觉的一个重要分支,旨在模拟和分析三维空间中的物体、场景和运动。它结合了图像处理、计算几何学、机器学习和深度学习等技术,以从二维图像或传感器数据中重建三维信息。本文主要介绍 3D 视觉中的一些基础概念。 目录 一. 三维坐标系…

Datawhale学习笔记AI +新能源:电动汽车充电站充电量预测

赛题介绍 建立站点充电量预测模型,根据充电站的相关信息和历史电量数据,准确预测未来某段时间内充电站的充电量需求。 在赛题数据中,我们提供了电动汽车充电站的场站编号、位置信息、历史电量等基本信息。我们鼓励参赛选手在已有数据的基础上…

【C++初阶】引用内联函数auto关键字范围for循环nullptr

个人主页还有更多系列专栏:小白不是程序媛 我的小仓库:Gitee C系列专栏:C头疼记 目录 前言 引用 概念 引用的特点 常引用 引用的使用场景 做参数 做返回值 引用和指针的区别 引用和指针的不同点: 内联函数 内联函数…

【LeetCode刷题(数据结构与算法)】:二叉搜索树的范围和

一、什么是二叉搜索树 二叉搜索树(BST,Binary Search Tree),也称二叉排序树或二叉查找树 二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质 非空左子树的所有键值小于其根结…

Typora使用教程

相关介绍 Typora是一款所写即所得的Markdown编辑器,支持跨平台Window,Linux和Mac都可以。 相关链接 Typora安装包历史版本地址:官网历史版本地址 问题及知识点汇总 关于图片的问题-设置图像自动复制到自己指定文件夹下 问题描述 在写笔记的过程中&am…

Write-Ahead Log(PostgreSQL 14 Internals翻译版)

日志 如果发生停电、操作系统错误或数据库服务器崩溃等故障,RAM中的所有内容都将丢失;只有写入磁盘的数据才会被保留。要在故障后启动服务器,必须恢复数据一致性。如果磁盘本身已损坏,则必须通过备份恢复来解决相同的问题。 理论…

C++ 类和对象(上)------超详细解析,小白必看系列

目录 一、前言 二、面向过程和面向对象初步认识 三、类的引入 三、类的定义 四、类的访问限定符及封装 💦访问限定符 (重点!!!!) 💦封装 五、类的作用域 六、类的实例化 …

算法--排序算法效率比较

《算法设计与分析》课程实验报告 ( 实验一) 实验名称:排序算法效率比较 实验地点: 所使用的开发工具及环境: PC机,DEV 一、实验目的: 比较至少 4 种排序(从小到大排&#xff09…

从十月稻田,看大米为何能卖出200亿市值?

国无农不稳,民无粮不安。新时代的农村农民,需要现代化的农业作依托,而在农业现代化的过程中,品牌化、数字化成为至关重要的一环。 金秋十月,从南到北,从东到西,中国农村的每一块土地都洋溢着丰…

【运筹优化】运筹学导论:线性规划导论

文章目录 一、原形范例(Wyndor Glass 公司)1.1 线性规划模型构建1.2 图解法1.3 结论 二、线性规划模型2.1 线性规划模型的标准形式2.2 其他形式2.3 模型解的术语 三、有关线性规划的假设3.1 比例性3.2 可加性3.3 可分割性3.4 确定性 四、补充例子4.1 放射…

ant的basedir内置属性

basedir是ant的内置属性,代表项目基础路径的绝对路径。它的默认值等于build文件的父目录。当然,可以通过project 的basedir 属性、或者单独的basedir 属性来覆盖。 例如,在工程的根目录下有个build.xml文件: build.xml文件的内…

java springboot 实现 对象或对象数组 转为 前端可解析的JSON字符串格式

这是我的接口代码 逻辑就是 通过 IBookService对象中的 list 函数获取数据列表 然后定义 state(响应状态) message(提示信息) 最后将这三个信息 做成对象返回给前端 接口访问结果 但是这种对象数组对存储空间消耗肯定是比字符串大很多的 所以 我们来尝试 将json数组转成字符…