数据结构 - 列表 | 栈 | 队列

主要内容:

  • 1. 列表
  • 2. 栈
  • 3. 队列
  • 4. 用栈和队列解决迷宫问题

1. 列表

列表:在其他的编程语言中叫数组,是一种基本的数据结构

1.1 数组的存储,查找,以及时间复杂度

数组中的元素是存储在一块连续的内存中,而且必须 给定要存储的数据类型以及存储的长度,因此

  • 存储类型: 在创建时候必须声明存储的是那种的数据类型,这样数组中的元素的存储大小相同,加上是连续的存储方式,就可以依次进行查找 
  • 长度限制:声明长度,不能进行append操作,

 1.2 python中的列

1.2.1  python 中的列表如何存储

注: 突破数组的两个限制  存储类型  | append等操作

(1)实现变长(可以append以及pop)    动态扩张和动态收缩   

反之当执行pop操作时,会将剩余的元素,申请一块更小的内存,存储数据,原来开辟的内存,python会进行垃圾回收

 (2) 如何实现存储不同类型的元素

 lst = [3,3.15,'alex']

  • 当修改值的时候,只是新开辟一块内存存储新的值,初始的列表内存修改新的地址,
  • 此时没有引用的内存会被python回收  (引用计数的回收机制)

 1.3 python 列表操作的时间复杂度

  •  存储过程虽然存在赋值的操作,但是时间复杂度为O(1)    摊还分析法(均摊)
  • 另外pop不加内容的删除是O(1) ,给定内容的删除是O(n),存在位置的改变
  • 赋值,修改等操作的时间复杂度为O(1)

2. 栈 

2.1 栈的相关概述

  • 栈的定义: 栈(Stack) 是一个数据集合,可以理解为只能在一端进行插入或删除操作
  • 栈的特点:后进先出(last-in,first-out)  > FIFO
  • 栈的相关概念: 栈顶,栈底
  • 栈的基本操作:进栈 (压栈),push,出栈,(pop),取栈顶(gettop)

注; 关于概念的面试问题

三个数的进展序列是ABC,下面哪些选项不可能是出栈序列

  • CBA ,ABC,ACB,BAC,BCA,CAB      (CAB不可能)

五个数的时候:ABCDE  进展序列

  • ACBDE AEDCB ADBCE ABDCE

规律 三个元素 123进栈,出栈不可能是312

2.2 python实现栈

不需要自己定义,使用列表结构就可以

  • 进栈函数 :append
  • 出栈函数: pop
  • 查看栈顶函数:li[-1]

栈的应用: 括号匹配问题: 给一个字符串,其中包含小括号、中括号、大括号,求该字符串中的括号是否匹配

def brace_match(s):
    stack = []
    d = {'(':')','[':']','{':'}'}
    for ch in s:
        if ch in {'(','[','{'}:
            stack.append(ch)
        elif ch in {')', ']', '}'}:
            if len(stack) == 0:
                return False
            elif d[stack[-1]] == ch:
                stack.pop()
            else:
                return False
        else:
            pass
    if len(stack) > 0:
        return False
    else:
        return True

2.3 队列

2.3.1 队列的概述:

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

双向队列:队列的两端都允许进行进队和出队操作

            

2.3.2 队列的实现原理   --> 环形队列

环形队列:当队尾指针front == Maxsize + 1时,再前进一个位置就自动到0。

实现方式:求余数运算

  • 队首指针前进1:front = (front + 1) % MaxSize
  • 队尾指针前进1:rear = (rear + 1) % MaxSize
  • 队空条件:rear == front
  • 队满条件:(rear + 1) % MaxSize == front

                        

2.3.3 队列的内置模块

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

q = deque()
q.append(1)
q.append(2)
q.append(3)
print(q.popleft())

问题1 : 如何读取一个文件的后五行?

print(list(deque(open('abc.txt', 'r', encoding='utf-8'), 5)))

# q = deque([1,2,3,4,5], 3)
# print(list(q))               #[3, 4, 5]

问题2:如何用两个栈实现一个队列

#进队: 进栈1; 出队:出栈2;如果栈2空,就将栈1一次出栈并进到栈2,在从栈2出栈一次

class Queue:
    def __init__(self):
        self.stack1 =[]
        self.stack2 =[]

    def push(self,val):
        self.stack1.append(val)

    def pop(self):
        if len(self.stack2) > 0:
            return self.stack2.pop()
        elif len(self.stack1) > 0:
            while len(self.stack1) > 0:
                self.stack2.append(self.stack1.pop())
            return self.stack2.pop()
        else:
            raise ValueError('empty queue')

4. 用栈和队列解决迷宫问题

 

 

posted @ 2019-03-31 15:25  一路向北_听风  阅读(183)  评论(0)    收藏  举报