python数据结构学习笔记栈和队列

栈,就一个口,后进先出(LIFO),链表

队列,先进先出(FIFO),树

 

栈的操作:

1.创建一个新的空栈

2.添加一个新的元素到栈顶

3.弹出栈顶元素,出栈

4.返回栈顶元素

5.判断是否为空

6.返还元素个数

 

class Stack(object):
    """栈,存放栈可以用链表,也可以用顺序表,这里用顺序表"""
    def __init__(self):
        """
        私有变量外界不能访问,比如stack = Stack(),print(stack.__list)会报错
        私有变量的设置是不希望外人能修改,这里就是不希望外人直接随意修改栈本身,
        而是要通过定义的操作
        """
        self.__list =[]

    def push(self, item):
        """添加一个新的元素item到栈顶"""
        # 这里为什么选择在列表的尾部插入,而不是在头部插入
        # 尾部插入出栈也可以pop,在头部插入也可以出栈
        # 原因在于,对于列表,在尾部插入计算复杂度是O(1)
        # 而头部插入是O(n)
        self.__list.append(item)
        # self.__list.insert(0, item)  # 头部插入

    def pop(self):
        """弹出栈顶元素"""
        return self.__list.pop()        
        # self.__list.pop(0)  # 头部插入对应的出栈操作

    def peek(self):
        """返回栈顶元素"""
        if self.__list:
            return self.__list[-1]  #空列表不支持-1操作
        else:
            return None

    def is_empty(self):
        """判断栈是否为空"""
        # return self.__list  # 如果这么写,is_empty就直接拿到列表了
        return self.__list == []

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

if __name__== "__main__":
    s = Stack()
    s.push(1)
    s.push(2)
    print(s.pop())

队列:

1.创建一个新的空队列

2.添加一个新的元素到队列

3.出队

4.判断是否为空

class Queue(object):
    def __init__(self):
        """这里还是使用顺序表"""
        self.__list = []

    def enqueue(self, item):
        """往队列中添加一个item元素"""
        self.__list.append(item)
        # self.__list.insert(0, item)
        # 队列的进队出队不管哪种方式都会一个O(1),一个O(n)
        # 选择时要根据队列常用的操作来决定到底是头插还是尾插

    def dequeue(self, item):
        """从队列头部删除一个元素"""
        return self.__list.pop(0)
        # return self.pop()
    def is_empty(self):
        """从队列头部删除一个元素"""
        return self.__list == []

    def size(self):
        """从队列头部删除一个元素"""
        return len(self.__list)

双端队列:

1.建立队列

2.在头部添加

3.在尾部添加

4.头部删除

5.尾部删除

class Deque(object):
    def __init__(self):
        """这里还是使用顺序表"""
        self.__list = []

    def add_front(self, item):
        """往队列头部添加一个item元素"""
        self.__list.insert(0, item)

    def add_rear(self, item):
        """往队列尾部添加一个item元素"""
        self.__list.append(item)

    def pop_front(self):
        """从队列头部删除一个元素"""
        return self.__list.pop(0)

    def pop_rear(self):
        """从队列头部删除一个元素"""
        return self.__list.pop()

    def is_empty(self):
        """从队列头部删除一个元素"""
        return self.__list == []

    def size(self):
        """从队列头部删除一个元素"""
        return len(self.__list)

 

你可能感兴趣的:(数据结构与算法,python)