文章目录

  • 一、什么是栈?
  • 二、栈的实现
  • 三、栈的应用
    • 1.括号匹配
      • 20. 有效的括号
    • 2. 四则表达式求值
    • 3.设计一个有getMin功能的栈

一、什么是栈?

  栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素、访问元素、删除元素。栈是限定仅在表尾进行插入与删除操作的线性表。通俗理解来说,

栈也是一种线性结构,相比数组,栈对应的操作是数组的子集,只能从一端添加元素,也只能从同一端取出元素

把允许添加和删除的一端称为栈顶(top) ,另一端称为栈底(bottom)。栈是一种后进先出(Last In First Out (LIFO))的数据结构。
思考:最先进栈的元素,是不是只能最后出栈?

不是,因为栈只是对添加与取出元素的位置(栈顶)进行了限制,并没有对时间进行了限制。举一个例子来说,可以是进1个出1个,也可以是先都进去然后在都出来。第一个取出元素顺序为[1,2,3…],第二个取出元素顺序为[…3,2,1]

二、栈的实现

  栈可以用顺序表实现,也可以用链表实现。栈主要实现如下功能:

Stack()创建一个新的空栈
push(elem)添加一个新的元素elem到栈顶
pop()弹出栈顶元素
peek()返回栈顶元素
is_empty()判断栈是否为空
size()返回栈的元素个数

#栈
class Stack(object):'''栈'''def __init__(self):self.__list = []def push(self,item):#添加一个新的元素到栈顶self.__list.append(item)def pop(self):#弹出栈顶元素return self.__list.pop()def peek(self):#返回栈顶元素if self.__list:return self.__list[-1]else:return Nonedef is_empty(self):'''判断栈为空'''return self.__list == []def size(self):'''返回栈顶元素'''return len(self.__list)if __name__ == '__main__':s = Stack()s.push(1)s.push(2)s.push(3)print(s.pop())print(s.pop())print(s.pop())
3
2
1

三、栈的应用

  我们常见的各类编辑器所对应的撤销操作就是对应于栈这种数据结构。

1.括号匹配

20. 有效的括号

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

这个题是括号匹配问题。栈顶元素反映了在嵌套的层次关系中,最近的需要匹配的元素。
思路:

从前向后扫描字符串:遇到左括号X,就压栈x
遇到右括号y:
如果发现栈顶元素x和该括号y匹配,则栈顶元素出栈,继续判断下一个字符;
如果栈顶元素x和该括号不匹配,字符串不匹配,
如果栈为空,字符串不匹配
扫描完成后,如果栈恰好为空,则字符串匹配,否则,字符串不匹配

class Solution:def isValid(self, s: str) -> bool:# 栈stack =[]# 从左到右扫描for ch in s:# 如果碰到左括号,则压入栈if ch in ['(','{','[']:stack.append(ch)else:# 如果碰到右括号,则弹出栈顶元素与右括号进行比较if stack:left = stack.pop()else:return Falseif left == '(' and ch == ')' or left == '[' and ch == ']' or left == '{' and ch == '}':continueelse:return Falseif stack == []:return Trueelse:return False

2. 四则表达式求值

  这里需要用到后缀表示法。在后缀表示法中,所有的符号都是在要运算数字的后面出现。那么后缀表达式是如何得来的呢?

规则:从左到右遍历中缀表达式每个数字和符号,
若是数字就输出,即成为后缀表达式的一部分;
若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号(乘除优先加减)
则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止

  四则表达式运算用到了后缀表达式。那怎么处理后缀表达式来进行运算呢?

后缀表达式中,如果碰到数字就进栈。如果碰到符号[’+’,’-’,’*’,’/’],就弹出两个数字,做符号运算,再进栈

下面是后缀表达式用于四则运算的python实现。

#四则运算表达式
class Solution:def evalRPN(self, tokens):""":type tokens: List[str]:rtype: int"""stack = []for s in tokens:if s in ['+','-','*','/']:b = stack.pop()a = stack.pop()if s == '+':stack.append(a+b)elif s == '-':stack.append(a-b)elif s == '*':stack.append(a*b)else:stack.append(int(a/b))else:stack.append(int(s))ans = int(stack.pop())return ans

3.设计一个有getMin功能的栈

实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
【要求】
1、 pop、push、getMin操作的时间复杂度都是O(1)。
2.、设计的栈类型可以使用现成的栈结构

思路:

俩个栈,一个是普通栈里面放数据,另一个栈里面放栈中最小值

第一种方法:

在压栈时判断插入时为空栈或者元素小于等于当前栈顶元素,压入最小值栈中。如果弹栈元素大小等于(不可能小于)最小值栈顶元素,同时从最小值栈中弹出。

class NewStack1:def __init__(self):self.stackData = []self.stackMin = []def push(self, newNum):self.stackData.append(newNum)if len(self.stackMin) == 0 or newNum <= self.getMin():self.stackMin.append(newNum)def pop(self):if len(self.stackData) == 0:raise Exception("stack is empty!")value = self.stackData.pop()if self.getMin() == value:self.stackMin.pop()return valuedef getMin(self):if len(self.stackMin) == 0:raise Exception("stack is empty!")return self.stackMin[-1]

第二种方法:

如果插入的元素比当前栈中最小值大,则将最小值重复入栈。
弹栈时,同时弹出数据栈和最小值栈中的一个元素。

class NewStack2:def __init__(self):self.stackData = []  # 普通栈self.stackMin = []    # 最小栈def push(self, newNum):self.stackData.append(newNum)if len(self.stackMin) == 0 or newNum < self.getMin():self.stackMin.append(newNum)else:# 添加元素比当前最小值大时,将最小值元素重复入栈self.stackMin.append(self.getMin())# 弹栈时,同时弹出数据栈和最小值栈中的一个元素def pop(self):if len(self.stackData) == 0:raise Exception("Stack is empty!")self.stackMin.pop()return self.stackData.pop()def getMin(self):if len(self.stackMin) == 0:raise Exception("Stack is empty!")return self.stackMin[-1]

如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!


数据结构与算法python—4.栈及python实现与leetcode总结相关推荐

  1. 视频教程-Python数据结构与算法面试(上)-Python

    Python数据结构与算法面试(上) 东北大学计算机专业硕士研究生,欧瑞科技创始人&CEO,曾任国内著名软件公司项目经理,畅销书作者,企业IT内训讲师,CSDN学院专家讲师,制作视频课程超过1 ...

  2. Python数据结构与算法(1.5)——Python基础之函数与异常

    Python数据结构与算法(1.5)--Python基础之函数与异常 0. 学习目标 1. 函数 1.1 自定义函数 1.2 函数与参数 1.3 函数与返回值 2. 异常处理 2.1 raise 语句 ...

  3. Python数据结构与算法(1.4)——Python基础之控制结构

    Python数据结构与算法(1.4)--Python基础之控制结构 0. 学习目标 1. 代码块与缩进 2. 条件语句 2.1 if 语句 2.2 if 语句的嵌套 2.3 断言 3. 循环 3.1 ...

  4. Python数据结构与算法(1.3)——Python基础之输入、输出与高阶赋值

    Python数据结构与算法(1.3)--Python基础之输入.输出与高阶赋值 0. 学习目标 1. 输入.输出与注释 1.1 获取用户输入 1.2 格式化输出 1.2.1 基本方法 1.2.2 fo ...

  5. Python数据结构与算法(1.2)——Python基础之变量与内置数据类型

    Python数据结构与算法(1.2)--Python基础之变量与内置数据类型 0. 学习目标 1. Python 程序的运行 1.1 Python 交互式解释器 1.2 Python 程序脚本 2. ...

  6. Python数据结构与算法(1.6)——Python基础之类与模块化

    Python数据结构与算法(1.6)--Python基础之类与模块化 0. 学习目标 1. 面向对象编程:类 1.1 面向对象编程的基本概念 1.1.1 多态 1.1.2 封装 1.1.3 继承 1. ...

  7. 视频教程-Python全栈视频教程-Python

    Python全栈视频教程 毕业于清华大学,曾担任Google算法工程师,微软人工智能领域全球最具价值专家,微软Tech Ed 大会金牌讲师. 精通C/ C++,Python ,Go语言,Sicikit ...

  8. php学数据结构,PHP 程序员学数据结构与算法之《栈》

    介绍 "要成高手,必练此功". 要成为优秀的程序员,数据结构和算法是必修的内容.而现在的Web程序员使用传统算法和数据结构都比较少,因为很多算法都是包装好的,不用我们去操心具体的实 ...

  9. c语言编写队列元素逆置,数据结构与算法实验—利用栈逆置队列元素.doc

    数据结构与算法实验-利用栈逆置队列元素 利用栈逆置队列元素实验报告 通信1204班 谢崇赟 实验名称 利用堆栈将队列中的元素逆置 实验目的 会定义顺序栈和链栈的结点类型. 掌握栈的插入和删除结点在操作 ...

  10. 数据结构与算法:树与二叉树python实现

    最近复习一遍数据结构与算法,做一些笔记,大家可以一起复习. 一.树的一些容易混淆的定义: 结点层:根结点的层定义为1:根的孩子为第二层结点,依此类推: 树的深度(或高度):树中最大的结点层: 满二叉树 ...

最新文章

  1. 张口闭口就是焦虑,现在的程序员怎么了?
  2. 2021年6月程序员工资排行榜,南京这是怎么了?有啥大动作吗?
  3. idea窗口下方滚动条不明显设置
  4. Windows驱动开发 - 派遣函数
  5. Django 之母板
  6. CVPR 2015 papers
  7. python 运行结果保存_『如何将python运行结果保存成txt,万分感谢呐』python txt教程...
  8. 怎样下载C/C++的免费、开源且跨平台IDE——Code::Blocks
  9. 基于DeepConvLSTM的传感器信号分类
  10. [Java基础]List集合子类特点
  11. 《盘点那些秀你一脸的秒天秒地算法》(3)
  12. dedecms右侧悬浮_织梦dedecms网站上添加漂浮广告
  13. css 旋转 animation动画
  14. django之同源策略
  15. Java 14 有哪些新特性?
  16. 全局变量反汇编与重定位
  17. VS实用小工具(检测代码内存泄漏等问题)
  18. Java使用ODBC连接Access数据库
  19. 2019年美赛B题思路详解
  20. Scrum板与Kanban如何抉择?jlqpzlmlp板与按照znbpdl

热门文章

  1. NHibernate.Cfg.HibernateConfigException
  2. 《迎向开阔的人生》——刘墉
  3. 基于OleDb的Excel数据访问
  4. Scaled Exponential Linear Unit
  5. C++ 各种数据类型须知
  6. .Net 数据类型转化
  7. KingDZ 变菜鸟,每日一个C#小实例之---玩转鼠标
  8. Oracle_视图_索引_plsql_游标_存储过程_存储函数_触发器
  9. django url 路由设置技巧
  10. C# Linq to sql 实现 group by 统计多字段 返回多字段