堆:

①堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:

·堆中某个节点的值总是不大于或不小于其父节点的值;

·堆总是一棵完全二叉树。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。

②堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。

③堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。

④堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。

堆的应用:

  1. #堆排序
  2. def sift(li, left, right):
  3. i = left
  4. j = 2 * i + 1
  5. tmp = li[left]
  6. while j <= right:
  7. if j+1 <= right and li[j] < li[j+1]:
  8. j = j + 1
  9. if tmp < li[j]:
  10. li[i] = li[j]
  11. i = j
  12. j = 2 * i + 1
  13. else:
  14. break
  15. li[i] = tmp
  16.  
  17. def heap_sort(li):
  18. n = len(li)
  19. for i in range(n//2-1, -1, -1): #建立堆
  20. sift(li, i, n-1)
  21.  
  22. for i in range(n-1, -1, -1): #挨个出数
  23. li[0], li[i] = li[i],li[0]
  24. sift(li, 0, i-1)
  25.  
  26. li = [6,8,1,9,3,0,7,2,4,5]
  27. heap_sort(li)
  28. print(li)

  

栈:

栈(stack)又名堆栈,一个数据集合,可以理解为只能在一端进行插入或删除操作的列表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底

②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出)

③栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。

栈的基本操作:
  进栈(压栈):push
  出栈:pop
  取栈顶:gettop

用python实现堆栈

  1. # 后进先出
  2. class Stack():
  3. def __init__(self,size):
  4. self.size=size
  5. self.stack=[]
  6. self.top=-1
  7.  
  8. def push(self,x):
  9. if self.isfull():
  10. raise exception("stack is full")
  11. else:
  12. self.stack.append(x)
  13. self.top=self.top+1
  14.  
  15. def pop(self):
  16. if self.isempty():
  17. raise exception("stack is empty")
  18. else:
  19. self.top=self.top-1
  20. self.stack.pop()
  21.  
  22. def isfull(self):
  23. return self.top+1 == self.size
  24. def isempty(self):
  25. return self.top == '-1'
  26. def showStack(self):
  27. print(self.stack)
  28.  
  29. s=Stack(10)
  30. for i in range(5):
  31. s.push(i)
  32. s.showStack()
  33. for i in range(3):
  34. s.pop()
  35. s.showStack()
  36.  
  37. """
  38. 类中有top属性,用来指示栈的存储情况,初始值为1,一旦插入一个元素,其值加1,利用top的值乐意判定栈是空还是满。
  39. 执行时先将0,1,2,3,4依次入栈,然后删除栈顶的前三个元素
  40. """

栈的应用——括号匹配问题

括号匹配问题:给一个字符串,其中包含小括号、中括号、大括号,求该字符串中的括号是否匹配。例如:
()()[]{}    匹配
([{()}])    匹配
[](          不匹配
[(])        不匹配

  1. def kuohao_match(exp):
  2. stack = []
  3. di = {'(':')', '{':'}', '[':']'}
  4. for c in exp:
  5. if c in {'(','{', '['}:
  6. stack.append(c)
  7. else:
  8. if len(stack) == :
  9. return False
  10. top = stack.pop()
  11. if di[top] != c:
  12. return False
  13. if len(stack) > :
  14. return False
  15. else:
  16. return True
  17.  
  18. print(kuohao_match('()[]{([]][]}()'))

栈的应用——括号匹配问题

栈的应用——迷宫问题

  1. '''
  2. 解决思路
  3. 在一个迷宫节点(x,y)上,可以进行四个方向的探查:maze[x-][y], maze[x+][y], maze[x][y-], maze[x][y+]
  4. 思路:从一个节点开始,任意找下一个能走的点,当找不到能走的点时,退回上一个点寻找是否有其他方向的点。
  5. 方法:创建一个空栈,首先将入口位置进栈。当栈不空时循环:获取栈顶元素,寻找下一个可走的相邻方块,如果找不到可走的相邻方块,说明当前位置是死胡同,进行回溯(就是讲当前位置出栈,看前面的点是否还有别的出路)
  6.  
  7. '''
  8.  
  9. maze = [
  10. [,,,,,,,,,],
  11. [,,,,,,,,,],
  12. [,,,,,,,,,],
  13. [,,,,,,,,,],
  14. [,,,,,,,,,],
  15. [,,,,,,,,,],
  16. [,,,,,,,,,],
  17. [,,,,,,,,,],
  18. [,,,,,,,,,],
  19. [,,,,,,,,,]
  20. ]
  21.  
  22. dirs = [lambda x, y: (x + , y),
  23. lambda x, y: (x - , y),
  24. lambda x, y: (x, y - ),
  25. lambda x, y: (x, y + )]
  26.  
  27. def mpath(x1, y1, x2, y2):
  28. stack = []
  29. stack.append((x1, y1))
  30. while len(stack) > :
  31. curNode = stack[-]
  32. if curNode[] == x2 and curNode[] == y2:
  33. #到达终点
  34. for p in stack:
  35. print(p)
  36. return True
  37. for dir in dirs:
  38. nextNode = dir(curNode[], curNode[])
  39. if maze[nextNode[]][nextNode[]] == :
  40. #找到了下一个
  41. stack.append(nextNode)
  42. maze[nextNode[]][nextNode[]] = - # 标记为已经走过,防止死循环
  43. break
  44. else:#四个方向都没找到
  45. maze[curNode[]][curNode[]] = - # 死路一条,下次别走了
  46. stack.pop() #回溯
  47. print("没有路")
  48. return False
  49.  
  50. mpath(,,,)

栈的应用__迷宫问题

队列

  • 队列(Queue)是一个数据集合,仅允许在列表的一端进行插入,另一端进行删除。
  •   进行插入的一端称为队尾(rear),插入动作称为进队或入队
  •   进行删除的一端称为队头(front),删除动作称为出队
  • 队列的性质:先进先出(First-in, First-out)
  • 双向队列:队列的两端都允许进行进队和出队操作

使用方法:from collections import deque
创建队列:queue = deque(li)
进队:append
出队:popleft
双向队列队首进队:appendleft
双向队列队尾进队:pop

队列的实现原理

队列的实现原理:环形队列

队列的应用:

  1. '''
  2. 思路:从一个节点开始,寻找所有下面能继续走的点。继续寻找,直到找到出口。
  3. 方法:创建一个空队列,将起点位置进队。在队列不为空时循环:出队一次。如果当前位置为出口,则结束算法;否则找出当前方块的4个相邻方块中可走的方块,全部进队。
  4.  
  5. '''
  6.  
  7. from collections import deque
  8.  
  9. mg = [
  10. [,,,,,,,,,],
  11. [,,,,,,,,,],
  12. [,,,,,,,,,],
  13. [,,,,,,,,,],
  14. [,,,,,,,,,],
  15. [,,,,,,,,,],
  16. [,,,,,,,,,],
  17. [,,,,,,,,,],
  18. [,,,,,,,,,],
  19. [,,,,,,,,,]
  20. ]
  21.  
  22. dirs = [lambda x, y: (x + , y),
  23. lambda x, y: (x - , y),
  24. lambda x, y: (x, y - ),
  25. lambda x, y: (x, y + )]
  26.  
  27. def print_p(path):
  28. curNode = path[-]
  29. realpath = []
  30. print('迷宫路径为:')
  31. while curNode[] != -:
  32. realpath.append(curNode[:])
  33. curNode = path[curNode[]]
  34. realpath.append(curNode[:])
  35. realpath.reverse()
  36. print(realpath)
  37.  
  38. def mgpath(x1, y1, x2, y2):
  39. queue = deque()
  40. path = []
  41. queue.append((x1, y1, -))
  42. mg[x1][y1] = -
  43. while len(queue) > :
  44. curNode = queue.popleft()
  45. path.append(curNode)
  46. if curNode[] == x2 and curNode[] == y2:
  47. #到达终点
  48. # for i,j,k in path:
  49. # print("(%s,%s) %s"%(i,j,k))
  50. print_p(path)
  51. return True
  52. for dir in dirs:
  53. nextNode = dir(curNode[], curNode[])
  54. if mg[nextNode[]][nextNode[]] == : # 找到下一个方块
  55. queue.append((nextNode[], nextNode[], len(path) - ))
  56. mg[nextNode[]][nextNode[]] = - # 标记为已经走过
  57. return False
  58.  
  59. mgpath(,,,)

队列的应用--队列解决迷宫问题

链表

  链表中每一个元素都是一个对象,每个对象称为一个节点,包含有数据域key和指向下一个节点的指针next。通过各个节点之间的相互连接,最终串联成一个链表。

节点的定义:

  1. class Node(object):
  2. def __init__(self, item):
  3. self.item = item
  4. self.next = None

头节点:

链表的遍历:

  1. #遍历链表
  2. def traversal(head):
  3. curNode = head #临时用指针
  4. while cueNode is not None:
  5. print(curNode.data)
  6. curNode = curNode.Next

  

链表节点的插入和删除

  1. 插入:
  2. p.next = curNode.next
  3. curNode.next = p
  4.  
  5. 删除:
  6. p = curNode.next
  7. curNode.next = curNode.next.next
  8. del p

  

建立链表

  1. #头插法:
  2. def createLinkListF(li):
  3. l = Node()
  4. for num in li:
  5. s = Node(num)
  6. s.next = l.next
  7. l.next = s
  8. return l

  1. #尾插法
  2. def createLinkListR(li):
  3. l = Node()
  4. r = l #r指向尾节点
  5. for num in li:
  6. s = Node(num)
  7. r.next = s
  8. r = s

双链表

双链表中每个节点有两个指针:一个指向后面节点、一个指向前面节点。
节点定义:

  1. class Node(object):
  2. def __init__(self, item=None):
  3. self.item = item
  4. self.next = None
  5. self.prior = None

双链表的插入和删除

  1. #插入:
  2. p.next = curNode.next
  3. curNode.next.prior = p
  4. p.prior = curNode
  5. curNode.next = p
  6.  
  7. #删除:
  8. p = curNode.next
  9. curNode.next = p.next
  10. p.next.prior = curNode
  11. del p

  

建立双链表

  1. def createLinkListR(li):
  2. l = Node()
  3. r = l
  4. for num in li:
  5. s = Node(num)
  6. r.next = s
  7. s.prior = r
  8. r = s
  9. return l, r

  

栈与队列的异同

栈(Stack)和队列(Queue)是两种操作受限的线性表。

(线性表:线性表是一种线性结构,它是一个含有n≥0个结点的有限序列,同一个线性表中的数据元素数据类型相同并且满足“一对一”的逻辑关系。

“一对一”的逻辑关系指的是对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。)

这种受限表现在:栈的插入和删除操作只允许在表的尾端进行(在栈中成为“栈顶”),满足“FIFO:First In Last Out”;队列只允许在表尾插入数据元素,在表头删除数据元素,满足“First In First Out”。

栈与队列的相同点:

1.都是线性结构。

2.插入操作都是限定在表尾进行。

3.都可以通过顺序结构和链式结构实现。、

4.插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。

5.多链栈和多链队列的管理模式可以相同。

栈与队列的不同点:

1.删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。

2.应用场景不同;常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现,深度优先搜索遍历等;常见的队列的应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。

3.顺序栈能够实现多栈空间共享,而顺序队列不能。

数据结构&算法(一)_堆、栈(堆栈)、队列、链表的更多相关文章

  1. 堆”,"栈","堆栈","队列"以及它们的区别

    如果你学过数据结构,就一定会遇到“堆”,"栈","堆栈","队列",而最关键的是这些到底是什么意思?最关键的是即使你去面试,这些都还会问到, ...

  2. 什么是“堆”,"栈","堆栈","队列",它们的区别?

    堆:什么是堆?又该怎么理解呢? ①堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: ·堆中某个节点的值总是不大于或不小于其父节点的值: ·堆总是一棵完全二叉树. 将根节点最大的堆叫做最大堆 ...

  3. 纯数据结构Java实现(2/11)(栈与队列)

    栈和队列的应用非常多,但是起实现嘛,其实很少人关心. 但问题是,虽然苹果一直宣传什么最小年龄的编程者,它试图把编程大众化,弱智化,但真正的复杂问题,需要抽丝剥茧的时候,还是要 PRO 人士出场,所以知 ...

  4. Leedcode算法专题训练(栈和队列)

    1. 用栈实现队列 232. Implement Queue using Stacks (Easy) Leetcode / 力扣 class MyQueue { Stack<Integer> ...

  5. C语言数据结构——第三章 栈和队列

    三.栈和队列 栈和队列是两种重要的线性结构.从数据结构的角度来看,栈和队列也是线性表,它的特殊性在于栈和队列的基本操作是线性表操作的子集,它们的操作相对于线性表来说是受到限制的,因此,可以称其为限定性 ...

  6. LeetCode通关:栈和队列六连,匹配问题有绝招

    刷题路线参考: https://github.com/chefyuan/algorithm-base https://github.com/youngyangyang04/leetcode-maste ...

  7. [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)

    再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...

  8. 用JS描述的数据结构及算法表示——栈和队列(基础版)

    前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里 ...

  9. Java数据结构和算法 - 栈和队列

    Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...

随机推荐

  1. hdu6073 Matching In Multiplication 分析+拓扑序

    Matching In Multiplication Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K ( ...

  2. windows下SVN服务的安装与配置

    第一步 下载 去svn官网下载一个最新版的svn svn官网下载地址 该链接会跳转到 https://sourceforge.net/projects/win32svn/ 进行下载 第二步 安装 双击 ...

  3. PHP上传类 图片上传 upload class实现image crop resize 缩略图

    manage uploaded files, and manipulate images in many ways through an HTML form, a Flash uploader, XM ...

  4. DpQuery.js

    (function (window) { //添加事件的方法通用所有 function addevent(evetname, fn, obj) { if (document.attachEvent) ...

  5. java ssh介绍(1)

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  6. iOS 横向菜单

    MKHorizMenu 源码地址 现在想要实现以下效果,其中“选时间”这部分是一个NavigationBar,“日期”是横向的菜单,“电影时段”是TableView. 比较难实现的是横向菜单,因为没有 ...

  7. 边缘检测sobel算子

    sobel算子 - sophia_hxw - 博客园http://www.cnblogs.com/sophia-hxw/p/6088035.html #1,个人理解 网上查了很多资料,都说sobel算 ...

  8. EntityFramework :数据库创建

    控制数据库的位置 默认情况下,数据库是创建在localhost\SQLEXPRESS服务器上,并且默认的数据库名为命名空间+context类名,例如我们前面的BreakAway.BreakAwayCo ...

  9. python uwsgi 部署以及优化

    这篇文章其实两个月之前就应该面世了,但是最近琐事.烦心事太多就一直懒得动笔,拖到现在才写 一.uwsgi.wsgi.fastcgi区别和联系 参见之前的文章 http://www.cnblogs.co ...

  10. eclipse新建maven web工程

    每次建maven项目,总会有问题.决定在这整理一次,避免以后浪费时间. 最后目录为 1.首先修改pom.xml 之前老是出现明明改了 java compiler 已maven update 一下就又变 ...