Python 栈(stack)
Python 栈(stack)
栈(stack)又名堆栈,它是一种运算受限的线性表
栈只能在一端进行插入和删除操作,它按照先进后出(FILO)的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶
栈也可以看成是 FILO 的队列 <- 点击查看
操作
- 进栈
- 出栈
- 取栈顶
示例:
class Stack(object):
def __init__(self):
self.stack = []
def push(self, data):
"""
进栈函数
"""
self.stack.append(data)
def pop(self):
"""
出栈函数,
"""
return self.stack.pop()
def gettop(self):
"""
取栈顶
"""
return self.stack[-1]
应用
检查括号
class Stack(object):
def __init__(self):
self.stack = []
def push(self, data):
"""
进栈函数
"""
self.stack.append(data)
def pop(self):
"""
出栈函数,
"""
return self.stack.pop()
def gettop(self):
"""
取栈顶
"""
return self.stack[-1]
def main(string):
stack = Stack()
check_dict = {
')': '(',
']': '[',
'}': '{'
}
for char in string:
if char in {'(', '[', '{'}:
stack.push(char)
elif char in {')', ']', '}'} and len(stack.stack) > 0:
if stack.gettop() == check_dict[char]:
stack.pop()
else:
return False
if len(stack.stack) == 0:
return True
else:
return False
print(main('{[()]}()[{()}]'))
迷宫问题
思路:从起点开始按照顺序寻找路径,通过栈记录已经走过的路径。如果最后发现不通就返回上一步,换个方向继续寻找
深度优先
def find_path(x1, y1, x2, y2):
"""
运用栈寻找迷宫路径
迷宫中 0 表示可以通过,1 表示无法通过,-1 表示已经走过的路
左上角坐标为 (0, 0),横轴为 y 轴,纵轴为 x 轴
迷宫四周必须用 1 围起来
:param int x1:起点 x 轴坐标
:param int y1:起点 y 轴坐标
:param int x2:终点 x 轴坐标
:param int y2:终点 y 轴坐标
:return: 是否找到出口
:rtype: bool
"""
paths = [lambda x, y: (x - 1, y), # 上
lambda x, y: (x, y + 1), # 右
lambda x, y: (x + 1, y), # 下
lambda x, y: (x, y - 1)] # 左
# 从起点进入迷宫
stack = list()
maze[x1][y1] = -1
stack.append((x1, y1))
while len(stack) > 0:
cur_node = stack[-1] # 当前位置
if cur_node[0] == x2 and cur_node[1] == y2:
# 到达终点
for p in stack:
print(p)
return True
for path in paths:
# 按照 dirs 顺序寻找路径
next_node = path(cur_node[0], cur_node[1])
if maze[next_node[0]][next_node[1]] == 0: # 如果可以走
stack.append(next_node)
maze[next_node[0]][next_node[1]] = -1 # 标记为已经走过,防止死循环
break
else: # 四个方向都没找到
stack.pop() # 回溯
print("没有出口")
return False
maze = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 0, 0, 1, 1, 0, 0, 1],
[1, 0, 1, 1, 1, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 1, 0, 0, 0, 1, 0, 0, 1],
[1, 0, 1, 1, 1, 0, 1, 1, 0, 1],
[1, 1, 0, 0, 0, 0, 0, 1, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
]
find_path(1, 1, 8, 8)
Python 栈(stack)的更多相关文章
- Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现
栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...
- BSS段 data段 text段 堆heap 和 栈stack
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数 ...
- [转]JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )
这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题: 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(h ...
- 堆heap和栈Stack(百科)
堆heap和栈Stack 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈 ...
- (转)Java里的堆(heap)栈(stack)和方法区(method)(精华帖,多读读)
[color=red][/color]<一> 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收. 引用数据类型,需要用new来创建,既在栈 ...
- STL(标准模板库) 中栈(stack)的使用方法
STL 中栈的使用方法(stack) 基本操作: stack.push(x) 将x加入栈stack中,即入栈操作 stack.pop() 出栈操作(删除栈顶),只是出栈,没有返回值 stack.t ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- 栈stack(2):栈的链表实现
定义 从上一篇我们知道,栈(stack)是一个只允许一端进行删除插入操作的线性表.同时,我们联想到线性表的链式结构,其特点是用一组任意的存储单元存储线性表的数据元素,因此我们选择使用链表去实现栈,规定 ...
- 栈stack(1):栈的数组实现
定义 栈(stack),是一个只允许在表尾端进行删除插入操作的线性表,是一种后进先出(LIFO,last in first out)的数据结构. 因此,对于栈来说,我们规定进行删除插入操作的表尾端称为 ...
随机推荐
- linux下的set, export, env的区别
set和export的区别 set可以用来显示所有变量的值,而export能将一个变量导出,在其子shell或子进程也可见 export和env的区别 两者的作用是一样的,只是env是一个外部工具 基 ...
- 166. 数独 dancing links 方法
dfs硬怼通过数独 N皇后的代码后 想学习下新的数据结构和算法来解决这类覆盖问题 习题练习 https://www.acwing.com/problem/content/168/ 数独 https:/ ...
- nginx学习(二):nginx显示默认首页解析过程
本篇文章分析下nginx 显示默认首页的过程 如下图所示 查看config文件: # 如果忘记nginx 安装目录.使用下面命令查看 [root@XXX]# whereis nginx nginx: ...
- python持久化对象
通过shelve模块即可持久化对象 代码 import shelve import numpy as np def writeObj(name,obj): with shelve.open('obje ...
- electron内监控目标网站cookie的变化,查找指定的cookie
let cookieInstance = win.webContents.session.cookies; cookieInstance.on('changed', (e, cookie, cause ...
- React: React的属性验证机制
一.简介 在开发中,属性变量类型的验证,几乎是任何语言都必须关注的问题,因为如果传入的数据类型不对,轻者程序运行仅仅是给出警告⚠️,严重的会直接导致程序中断,APP闪退或者web页面挂掉,这是很严重的 ...
- 《js高程》笔记总结一:基本概念(语法,数据类型,流程控制,函数)
1.ECMA 欧洲计算机制造商协会 2.";"的作用 代码后的:当压缩代码时可以用于压缩代码,有效的间隔开代码. 3.数据类型有 undefined,null,boolean,st ...
- C#中巧用Lambda进行数据的筛选查询等处理
场景 有一个Record对象的list,如果要根据其某个属性CycleIndex进行分组,类似于sql的group by分组查询. 如果要在这个这个list中查找出符合某种条件的数据,类似于sql的w ...
- C#程序员在老项目中用到VB遇到的一次坑
博主自认为C#基础还不错.但是最近接到一个需求,是用VB写的.万般不愿意,不想接触VB,并不是说VB语言不好,而是我真的不喜欢VB.因为没基础过VB,领导派给的任务,有这个需求,不愿意归不愿意,领导给 ...
- JS基础语法---函数练习part1---5个练习
练习1:求两个数字的和:获取任意的两个数字的和 function getSum(x, y) { return x + y; } console.log(getSum(10, 20)); 练习2:求1- ...