目录:
一. 数据结构中的一些概念
1、数据结构是什么
- 简单来说,数据结果就是设计数据以何种方式存储在计算机中
- 比如:列表,集合,与字典等都是一种数据结构
- 程序 = 数据结构 + 算法
2、数据结构与数据类型
1)数据类型:
- 说明:数据类型是一个值的集合和定义在此集合上一组操作(通常是增删改查或者操作读写的方法)的总称
- 数据类型:int、str、boolean、byte
2)数据结构:
- 说明:数据以什么方式构成,如何进行存储(数据结构是数据类型中的一种:结构类型)
- 数据结构:数组、栈、队列、链表、树、图、堆、散列表等
- python数据结构:列表、集合、字典、元祖
3、数据结构与数据类型比较
- 数据类型的分类为:原子类型 和 结构类型;
- 原子类型 = 一种值的集合 + 定义在值集合上的一组操作。(比如:python中的int,float,字符串)
- 结构类型 = 一种数据结构 + 定义在这种数据结构上的一组操作。(比如:python中的列表,字典,元组)
原子类型 + 结构类型 = 数据类型 - 注:数据类型是一个值的集合和定义在此集合上一组操作(通常是增删改查或者操作读写的方法)的总称
二. 栈(stack)
1、栈的定义
- 栈是一种数据集合,可以理解为只能在一端进行插入或删除操作的列表
2、栈的特点
- 后进先出(last-in, first-out)
3、栈的概念
- 栈顶,栈底
4、栈的基本操作
- 进栈(压栈):push
- 出栈:pop
- 取栈顶:gettop
python实现栈功能:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
class Stack(object):
def __init__(self):
self.stack = [] # 初始化一个栈
def push(self,item): # 入栈
self.stack.append(item)
def gettop(self): # 获取栈顶元素
return self.stack[-1]
def pop(self): # 出栈
return self.stack.pop()
if __name__ == '__main__':
s = Stack()
s.push(1)
s.push(2)
print(s.stack)
5、栈的使用:匹配括号是否成对出现
匹配括号是否成对出现:
def check_kuohao(s):
stack = []
for char in s:
if char in ['(','[','{']:
stack.append(char)
elif char == ')':
if len(stack)>0 and stack[-1] == '(':
stack.pop()
else:
return False
elif char == ']':
if len(stack) > 0 and stack[-1] == '[':
stack.pop()
else:
return False
elif char == '}':
if len(stack) > 0 and stack[-1] == '{':
stack.pop()
else:
return False
if len(stack) == 0:
return True
else:
return False
print(check_kuohao('(){}{}[]')) #True
三. 队列
1、队列定义
- 队列是一个数据集合,仅允许在列表的一端进行插入,另一端进行删除
- 插入的一端称为队尾(rear),插入动作叫进队或入队
- 进行删除的一端称为对头(front),删除动作称为出队
- 队列性质:先进先出(First-in, First-out)
- 双向队列:队列的两端都允许进行进队和出队操作
2、对列使用方法
- 导入: from collectios import deque
- 创建队列:queue = deque(li)
- 进队: append
- 出队: popleft
- 双向队列队首进队:appendleft
- 双向队列队尾出队:pop
python操作队列queue:
from queue import Queue
#1. 基本FIFO队列 先进先出 FIFO即First in First Out,先进先出
#2. maxsize设置队列中,数据上限,小于或等于0则不限制,容器中大于这个数则阻塞,直到队列中的数据被消掉
q = Queue(maxsize=0)
#3. 写入队列数据
q.put(0)
q.put(1)
q.put(2)
#4. 输出当前队列所有数据
print(q.queue)
#5. 删除队列数据,并返回该数据
q.get()
#6. 输也所有队列数据
print(q.queue)
3、双向对列原理图
- 环形对列:当对位指针front == Maxsize + 1 时,再进一个位置就自动到0
- 实现方法:求余数运算
- 队首指针前进1: front = (front + 1)%M
- axSize队尾指针前进1:rear = (rear+1)%MaxSize
- 队空条件:rear == front
- 队满条件:(rear+1)%MaxSize == front
4、队列应用场景
- 队列主要的功能是在多个进程间共享数据,实现业务解耦,提高效率
- 生产者线程只需要把任务放入队列中,消费者线程只需要到队列中取数据进行处理
5、队列与列表区别
- 列表中数据虽然是排列的,但数据被取走后还会保留,而队列中这个容器的数据被取后将不会保留
四. 链表
1、单链表
注:链表中每个元素都是一个对象,每个对象称为一个节点,包含有数据域key和指向下一节点的指针next,通过各个节点间的相互连接,最终串联成一个链表
单链表增删改查:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
class Node(object):
def __init__(<