数据结构:

线性结构,元素存在一对一的关系,例如列表
树结构,元素存在一对多的关系,例如层级结构
图结构,元素存在多对多的关系,例如地图
列表:
1、列表中的元素是怎么存储的?
是顺序存储的,是一块连续的内存
2、列表的操作:按下标查找,插入元素,删除元素


先说C中的数组:
查找的时间复杂度是O(1),因为知道首地址+每个元素的大小*index就找到了地址
数组与列表有两点不同:
1、数组元素类型要相同
2、数组长度固定

python中的列表如何实现?
Python中列表的类型可以不同
Python中的列表存放的不是值而是地址,32位机器一个地址占4个字节,地址的长度是固定的
列表长度不固定
Python解释器自动维护的,发现长度不够会新开辟一块内存,把之前的列表进行拷贝
python下标查找和append复杂度是O(1)
python列表的插入和删除的复杂度是O(n)

栈:

栈(stack)是一个数据集合,可以理解为只能在一端进行插入或删除操作的列表
栈的特点:LIFO
栈的概念:栈顶,栈底
栈的基本操作:(用列表可以实现)
进栈:li.append
出栈: li.pop()
取栈顶: li[-1]
class Stack(object):
def __init__(self):
self.stack = []
def pop(self):
return self.stack.pop()
def push(self, element):
return self.stack.append(element)
def get_top(self):
if self.stack:
return self.stack[-1]
else:
return None

栈的应用:括号匹配问题 '{[()[]{}]}'遇到左括号就入栈,遇到右括号就看栈顶的左括号,把匹配的左括号出栈,匹配完后栈为空说明匹配。

队列:

列表、栈、队列、链表、哈希表

队列的实现:

列表、栈、队列、链表、哈希表
class Queue:
    def __init__(self, size=100):
        self.queue = [0 for _ in range(size)]
        self.size = size
        self.rear = 0
        self.front = 0

    def push(self, element):
        if self.is_filled():
            raise IndexError("Queue is filled.")
        self.rear = (self.rear + 1) % self.size
        self.queue[self.rear] = element

    def pop(self):
        if self.is_empty():
            raise IndexError("Queue is empty.")
        self.front = (self.front + 1) % self.size
        return self.queue[self.front]

    def is_empty(self):
        return self.rear == self.front

    def is_filled(self):
        return (self.rear + 1) % self.size == self.front

q = Queue(5)
for i in range(4):
    q.push(i)
print(q.is_filled())
队列简单实现

相关文章: