栈(Stack)

定义

  • 栈是一种容器,其中添加移除新项总发生在同一端。这一端通常称为“顶部”。与顶部对应的端称为“底部”。
  • 最重要特性:先进后出。这一特性让栈拥有反转元素顺序的功能。如下图:

用数组实现一个顺序栈

  • Python的list及其操作可以提供与栈的使用方式有关的功能,可以使用list来实现栈。这里我们默认list末尾为栈顶。
class Stack:def __init__(self):self.items = []def isEmpty(self):return self.items == []def push(self, item):   # 进栈self.items.append(item)def pop(self):  #弹出return self.items.pop()def peek(self):  # 打印栈顶元素return self.items[len(self.items)-1]def size(self):return len(self.items)

用链表实现一个链式栈

  • 为什么需要链式栈?

主要考虑顺序表的两个特点:1)扩大存储需要一次高代价操作;2)顺序表需要完整的大块存储区。

  • 链式栈自然就以表头为栈顶
class ListNode:def __init__(self, elem, next=None):self.elem = elemself.next = nextclass LStack():def __init__(self):self._top = Nonedef isEmpty(self):return self._top is Nonedef push(self, elem):self._top = ListNode(elem, self._top)def pop(self):if self._top is None:raise ValueError('wrong in pop!')p = self._topself._top = p.nextreturn p.elemdef peek(self):if self._top is None:raise ValueError('wrong in peek!')return self._top.elemdef __repr__(self) -> str:cur = self._topnums = []while cur:nums.append(cur._data)cur = cur._nextreturn "--> ".join(f"{num}" for num in nums)if __name__ == '__main__':stack = LStack()for i in range(10):stack.push(i)print(stack)

编程模拟实现一个浏览器的前进、后退功能

class Browser():def __init__(self):self.x = LStack()  # 前进self.y = LStack()  # 后退def view(self, page):print('Viewing %s' % page, end='\n')self.x.push(page)def forward(self):if self.y.isEmpty():print( 'can not forward!')return top = self.y.pop()self.x.push(top)print('go to %s' % top, end='\n')def backward(self):if self.x.isEmpty():print('can not backward!')returntop = self.x.pop()self.y.push(top)print('back to %s' % top, end='\n')def can_forward(self):if self.y.isEmpty():return Falsereturn Truedef can_back(self):if self.x.isEmpty():return Falsereturn Trueif __name__ == '__main__':b = Browser()for i in ['a', 'b', 'c']:b.view(i)while b.can_back():b.backward()while b.can_forward():b.forward()b.forward()

Leetcode栗子

  • 20.Valid Parentheses
    http://note.youdao.com/noteshare?id=060ed93ca5145cdb9f9f000468584a5a&sub=B5F79C070F704F229BCC2D7B0503CE8F
  • 150.Evaluate Reverse Polish
    http://note.youdao.com/noteshare?id=301aab49bd4670990a050fe707e525ec&sub=844D15A999444DB4A71C709CCD7FACBF

队列(Queue)

定义

  • 队列也是一种容器,其中最重要的特性就是先进先出。如下图:

用链表实现一个链式队列

  • 最简单的单链表实现的话只能完成O(1)时间复杂度的enqueue操作和O(N)时间复杂度的dequeue操作,所以基于单链表的实现不太高效
  • 如果要实现首尾都是O(1)的话,我们可以尝试双向链表

用数组实现一个顺序队列

  • 基于python的list实现顺序队列,最直接的实现方法入队采取append(),出队采取pop(0),这样就得到一个O(1)时间复杂度的enqueue操作和O(N)时间复杂度的dequeue操作。

实现循环队列

  • 前面说的顺序队列显然不够高效,如果我们要实现所有操作都是O(1)时间,可以再设置一个指针,记住队头的位置,当出队操作完成后,更新队头指针。
  • 基于上述思想,同时为了防止内存空置消耗,可以采用循环队列的实现。
# coding=utf-8
# @author: kaiyuan
# blog: https://blog.csdn.net/Kaiyuan_sjtu
from itertools import chainclass CirQueue:def __init__(self, capacity):self._items = []self._capacity = capacity + 1self._head = 0self._rear = 0def enqueue(self, elem):if (self._rear + 1) % self._capacity == self._head:return Falseself._items.append(elem)self._rear = (self._rear + 1) % self._capacityreturn Truedef dequeue(self):if self._head != self._rear:item = self._items[self._head]self._head = (self._head + 1) % self._capacityreturn itemdef __repr__(self):if self._rear >= self._head:return " ".join(item for item in self._items[self._head: self._rear])else:return " ".join(item for item in chain(self._items[self._head:], self._items[:self._rear]))if __name__ == '__main__':cq = CirQueue(10)for i in range(10):cq.enqueue(str(i))print(cq)for i in range(5):cq.dequeue()print(cq)

队列栗子

  • 239.Sliding Window Maximum
    http://note.youdao.com/noteshare?id=452a2230fcaeabe561f36388e2b433ed&sub=70A2634D64344B1F98E230294E2FEAC3

递归

  • 递归的思路就是将问题分解成更小的子问题,知道得到一个足够小的问题可以被很简单的解决。通常涉及调用函数自身。
  • 所有的递归算法必须服从三个重要的定律:
    • 必须具有基本情况,即算法停止递归的条件;
    • 必须改变其状态并向基本情况靠近,即每一步问题的规模都变小;
    • 必须以递归方式调用自身
  • 递归实例:
    • 斐波那契数列:
      http://note.youdao.com/noteshare?id=14bd15bf2064325e56094d2bf7979f68&sub=21FD2E2D79EB41E28C54FC328E8A0ADC
    • 汉诺塔游戏:
    • 求阶乘
    • 爬楼梯:
      http://note.youdao.com/noteshare?id=7cf4e1f6fb826a3852e7ce00f70a58e7&sub=9E2BE6F55BCC470CA94783E6272917B8
    • etc

【数据结构与算法基础】队列、栈、递归相关推荐

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

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

  2. 【数据结构与算法基础】AOE网络与关键路径

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  3. 数据结构与算法基础(青岛大学-王卓)(1)

    士别三日当刮目相待,不好意思鸽了好久了,因为学习的时间不连续,所以我一直攒着,我又回来继续更新了 没有继续学习浙大的数据结构了,对比了青岛大学的王老师的这个教程我觉得更适合我一些,更入门,更详细. 课 ...

  4. 数据结构与算法基础(java版)

    目录 数据结构与算法基础(java版) 1.1数据结构概述 1.2算法概述 2.1数组的基本使用 2.2 数组元素的添加 2.3数组元素的删除 2.4面向对象的数组 2.5查找算法之线性查找 2.6查 ...

  5. 第六章.数据结构与算法基础

    目录 第六章.数据结构与算法基础(重点) 第一节.数组与矩阵 数组 稀疏矩阵 第二节.数据结构的定义 第三节.线性表 链表详解 顺序存储与链式存储对比 队列与栈 第四节.广义表 第五节.树与二叉树 树 ...

  6. 数据结构与算法--基础篇

    目录 概念 常见的数据结构 常见的算法 算法复杂度 空间复杂度 时间复杂度 数据结构与算法基础 线性表 数组 链表 栈 队列 散列表 递归 二分查找 概念 常见的数据结构 常见的算法 算法复杂度 空间 ...

  7. 【数据结构与算法基础】并查集原理、封装实现及例题解析(C和java)

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  8. 【Java面试高频问题】Java数据结构和算法基础知识汇总

    文章目录 Java数据结构和算法基础知识 一.Java数据结构 1. 线性结构:数组.队列.链表和栈 1.1 数组(Array) 1.2 稀疏数组 1.3 队列(Queue) 1.4 链表(Linke ...

  9. java算法概述,Java数据结构与算法基础(一)概述与线性结构

    Java数据结构与算法基础(二)递归算法 Java数据结构与算法基础(一)概述与线性结构 学习目的:为了能更顺畅的读很多底层API代码和拓宽解决问题的思路 一.数据结构概述 1.数据结构是什么?数据与 ...

  10. python数据结构与算法知识点_数据结构和算法基础知识点(示例代码)

    数据结构和算法基础知识点 链表 1.链表是一种由节点组成的线性数据集合,每个节点通过指针指向下一个节点.它是 一种由节点组成,并能用于表示序列的数据结构. 2.单链表:每个节点仅指向下一个节点,最后一 ...

最新文章

  1. RPM包制作之Spec文件详解
  2. mongo explain分析详解
  3. 【转】获取命名空间、类名、方法名
  4. Java 基于 UDP 实现 Socket中的多客户端通信
  5. SAP云平台的trial账号不具备成员管理的功能
  6. python编译exe运行慢_Python运行速度慢你知道这是为什么吗?
  7. swift 脚本_Swift脚本和命令行参数
  8. matlab中phi什么意思,球面座標matlab中Theta和Phi角的範圍?
  9. 论文关于mysql数据库文献_数据库论文参考文献
  10. VMware卸载后再安装提示无法打开注册表项 UNKNOWN\Components\…解决办法
  11. ubuntu20.04WPS解决缺失字体的问题
  12. 狼图腾--满族为什么能以少统多
  13. 感冒发烧不宜吃的食物与可以吃的食物
  14. 微信小程序【常见面试题】
  15. 从头开始 windows 10 安装awscli,aws sam
  16. 涂鸦Zigbee SDK开发系列教程——4.烧录授权
  17. 阿里云ACP认证(SLB专项)
  18. Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放-结局(四十)
  19. 常见 Web 攻击介绍
  20. 指针的大小--sizeof问题和sizeof使用规则

热门文章

  1. SAP License:第三只眼看经济-固定资产最佳折旧率的条件
  2. Axure高保真移动端智能数据监控+用户画像+饼状图+条形图+折线图数据统计+抖音直播app用户数据统计+智慧移动端主播粉丝、评论、播放量大数据统计+套餐购买、续费套餐prd流程
  3. 微信小程序 ----- this.getOpenerEventChannel is not a function
  4. luogu P1702 突击考试
  5. lnmp架构下,织梦二级域名访问m文件夹出现 500错误
  6. memcache未授权访问漏洞
  7. 为何高于四次的方程没有根式解?
  8. python的requests快速上手、高级用法和身份认证
  9. 系统封装接口层 cmsis_os
  10. [hackerrank]Closest Number