Python的内置的数据类型有Map,Set,List,Tuple

Map:字典,键值对,值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组

Set:集合,不能有重复的元素,元素之间是无序的。

List:列表(序列),可以增删改查,列表的数据项不需要具有相同的类型,创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可,可以增删改查,元素之间是有序的。

Tuple:元组与列表类似,不同之处在于元组的元素不能修改,但我们可以对元组进行连接组合。

这些具体的用法都可以从https://www.runoob.com/python3/python3-tutorial.html学习到。

可以发现少了很多常用的数据结构,比如Stack和Queue。下面我们可以利用List来自己实现出Stack和Queue。

一:使用List实现Stack

class Stack(object):
"""栈"""

def __init__(self):
self.__list = []

def push(self, item):
"""添加一个新元素item到栈顶"""
self.__list.append(item) # 尾部添加 ,时间复杂度o1
# self.__list.insert(0,item) 这样从尾部添加的时间复杂度为O(n)

def pop(self):
"""弹出栈顶元素"""
if self.__list == []:
raise LookupError('stack is empty!')
return self.__list.pop()

def peek(self):
"""返回栈顶元素"""
if self.__list:
return self.__list[-1]
return None

def is_empty(self):
"""判断栈是否为空"""
return self.__list == []

def size(self):
"""返回栈元素的个数"""
return len(self.__list)


if __name__ == '__main__':
s = Stack()
print(s.is_empty())
s.push(1)
s.push(3)
s.push(4)
print(s.pop())
print(s.pop())
print(s.pop())

二:使用List实现Queue

class Queue:
"""队列"""

def __init__(self):
self.__list = []

def enqueue(self, item):
"""往队列中添加一个元素"""
self.__list.append(item) # 时间复杂度o(1)

def dequeue(self):
"""从队列头部删除一个元素"""
return self.__list.pop(0) # 时间复杂度 o(n)

def is_empty(self):
"""判断是否为空"""
return self.__list == []

def size(self):
"""返回队列大小"""
return len(self.__list)



if __name__ == '__main__':
s = Queue()
print(s.is_empty())
s.enqueue(1)
s.enqueue(3)
s.enqueue(4)
print(s.dequeue())
print(s.dequeue())
print(s.dequeue())

三:使用List实现双向Queue

# 双端队列的实现
# -*- coding: utf-8 -*-


class Deque(object):
def __init__(self):
self.__list = []

def add_front(self, item):
"""往队列头部添加一个元素"""
self.__list.insert(0, item) # 时间复杂度o(1)

def add_rear(self, item):
"""往队列尾部添加一个元素"""
self.__list.append(item) # 时间复杂度o(1)

def pop_rear(self):
"""从队列尾部删除一个元素"""
return self.__list.pop() # 时间复杂度 o(1)

def pop_front(self):
"""从队列头部删除一个元素"""
return self.__list.pop(0) # 时间复杂度 o(n)

def is_empty(self):
"""判断是否为空"""
return self.__list == []

def size(self):
"""返回队列大小"""
return len(self.__list)