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)的更多相关文章

  1. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

  2. BSS段 data段 text段 堆heap 和 栈stack

    BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配.   数 ...

  3. [转]JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

    这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题: 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(h ...

  4. 堆heap和栈Stack(百科)

    堆heap和栈Stack 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈 ...

  5. (转)Java里的堆(heap)栈(stack)和方法区(method)(精华帖,多读读)

    [color=red][/color]<一> 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收.   引用数据类型,需要用new来创建,既在栈 ...

  6. STL(标准模板库) 中栈(stack)的使用方法

    STL 中栈的使用方法(stack) 基本操作: stack.push(x)  将x加入栈stack中,即入栈操作 stack.pop()  出栈操作(删除栈顶),只是出栈,没有返回值 stack.t ...

  7. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  8. 栈stack(2):栈的链表实现

    定义 从上一篇我们知道,栈(stack)是一个只允许一端进行删除插入操作的线性表.同时,我们联想到线性表的链式结构,其特点是用一组任意的存储单元存储线性表的数据元素,因此我们选择使用链表去实现栈,规定 ...

  9. 栈stack(1):栈的数组实现

    定义 栈(stack),是一个只允许在表尾端进行删除插入操作的线性表,是一种后进先出(LIFO,last in first out)的数据结构. 因此,对于栈来说,我们规定进行删除插入操作的表尾端称为 ...

随机推荐

  1. linux下的set, export, env的区别

    set和export的区别 set可以用来显示所有变量的值,而export能将一个变量导出,在其子shell或子进程也可见 export和env的区别 两者的作用是一样的,只是env是一个外部工具 基 ...

  2. 166. 数独 dancing links 方法

    dfs硬怼通过数独 N皇后的代码后 想学习下新的数据结构和算法来解决这类覆盖问题 习题练习 https://www.acwing.com/problem/content/168/ 数独 https:/ ...

  3. nginx学习(二):nginx显示默认首页解析过程

    本篇文章分析下nginx 显示默认首页的过程 如下图所示 查看config文件: # 如果忘记nginx 安装目录.使用下面命令查看 [root@XXX]# whereis nginx nginx: ...

  4. python持久化对象

    通过shelve模块即可持久化对象 代码 import shelve import numpy as np def writeObj(name,obj): with shelve.open('obje ...

  5. electron内监控目标网站cookie的变化,查找指定的cookie

    let cookieInstance = win.webContents.session.cookies; cookieInstance.on('changed', (e, cookie, cause ...

  6. React: React的属性验证机制

    一.简介 在开发中,属性变量类型的验证,几乎是任何语言都必须关注的问题,因为如果传入的数据类型不对,轻者程序运行仅仅是给出警告⚠️,严重的会直接导致程序中断,APP闪退或者web页面挂掉,这是很严重的 ...

  7. 《js高程》笔记总结一:基本概念(语法,数据类型,流程控制,函数)

    1.ECMA 欧洲计算机制造商协会 2.";"的作用 代码后的:当压缩代码时可以用于压缩代码,有效的间隔开代码. 3.数据类型有 undefined,null,boolean,st ...

  8. C#中巧用Lambda进行数据的筛选查询等处理

    场景 有一个Record对象的list,如果要根据其某个属性CycleIndex进行分组,类似于sql的group by分组查询. 如果要在这个这个list中查找出符合某种条件的数据,类似于sql的w ...

  9. C#程序员在老项目中用到VB遇到的一次坑

    博主自认为C#基础还不错.但是最近接到一个需求,是用VB写的.万般不愿意,不想接触VB,并不是说VB语言不好,而是我真的不喜欢VB.因为没基础过VB,领导派给的任务,有这个需求,不愿意归不愿意,领导给 ...

  10. JS基础语法---函数练习part1---5个练习

    练习1:求两个数字的和:获取任意的两个数字的和 function getSum(x, y) { return x + y; } console.log(getSum(10, 20)); 练习2:求1- ...