• python 使用顺序表实现栈和队列


    栈:

     1 # -*- coding: utf-8 -*-
     2 # @author: Tele
     3 # @Time  : 2019/04/24 下午 2:33
     4 # 采用list(顺序表)实现栈结构,后入先出
     5 class MyStack:
     6     def __init__(self):
     7         self.__list = list()
     8 
     9     def is_empty(self):
    10         return self.__list == list()
    11 
    12     def size(self):
    13         return len(self.__list)
    14 
    15     # 弹出栈顶元素(删除)
    16     def pop(self):
    17         return self.__list.pop()
    18 
    19     # 入栈
    20     def push(self, item):
    21         self.__list.append(item)
    22 
    23     # 返回栈顶元素
    24     def peek(self):
    25         if self.is_empty():
    26             return None
    27         else:
    28             return self.__list[-1]
    29 
    30 
    31 def main():
    32     mystack = MyStack()
    33     mystack.push(1)
    34     mystack.push(2)
    35     mystack.push(3)
    36     mystack.push(4)
    37     mystack.push(5)
    38     print(mystack.peek())
    39     print(mystack.pop())
    40     print(mystack.size())
    41     print(mystack.is_empty())
    42 
    43 
    44 if __name__ == '__main__':
    45     main()

    队列:

     1 # -*- coding: utf-8 -*-
     2 # @author: Tele
     3 # @Time  : 2019/04/28 下午 3:16
     4 # 队列,先进先出
     5 # 设定list的头即为队列的头,list的尾即为队列的尾
     6 class Queue:
     7     def __init__(self):
     8         self.__list = list()
     9 
    10     def is_empty(self):
    11         return self.__list == list()
    12 
    13     def size(self):
    14         return len(self.__list)
    15 
    16     # 入队
    17     def enqueue(self, item):
    18         self.__list.append(item)
    19 
    20     # 出队,从队列头部删除一个元素
    21     def dequeue(self):
    22         return self.__list.pop(0)
    23 
    24 
    25 def main():
    26     queue = Queue()
    27     queue.enqueue(1)
    28     queue.enqueue(2)
    29     queue.enqueue(3)
    30     print(queue.dequeue())
    31     print(queue.is_empty())
    32     print(queue.size())
    33 
    34 
    35 if __name__ == '__main__':
    36     main()

    双向队列:

     1 # -*- coding: utf-8 -*-
     2 # @author: Tele
     3 # @Time  : 2019/04/28 下午 3:24
     4 # 双端队列,类似两个栈的栈底合并在一起
     5 # 设定list的头即为队列的头,list的尾即为队列的尾
     6 class DoubleQueue:
     7     def __init__(self):
     8         self.__list = list()
     9 
    10     def is_empty(self):
    11         return self.__list == list()
    12 
    13     def size(self):
    14         return len(self.__list)
    15 
    16     # 在队头添加元素
    17     def add_front(self, item):
    18         self.__list.insert(0, item)
    19 
    20     # 在队尾添加元素
    21     def add_rear(self, item):
    22         self.__list.append(item)
    23 
    24     # 从队头删除元素
    25     def remove_front(self):
    26         return self.__list.pop(0)
    27 
    28     # 从队尾删除元素
    29     def remove_rear(self):
    30         return self.__list.pop()
    31 
    32 
    33 def main():
    34     dq = DoubleQueue()
    35     dq.add_front(1)
    36     dq.add_front(2)
    37     dq.add_rear(1000)
    38     print(dq.size())
    39     print(dq.is_empty())
    40     print(dq.remove_front())
    41     print(dq.remove_rear())
    42 
    43 
    44 if __name__ == '__main__':
    45     main()

    队列的头尾选择与list的头尾对应关系应根据实际需要,如入队的频率高(在队尾添加元素),则队列的的尾就是list的尾,因为append的的复杂度为O(1),反之出队的频率高(从队头删除一个元素),则队列的头部为list的尾部,pop的复杂度为O(1)

  • 相关阅读:
    [线段树][数学]JZOJ 4237 Melancholy
    [规律]JZOJ 4222 恐怖的奴隶主
    [Tarjan][基环树]JZOJ 4221 互相追逐的点
    [斯特林数][自然数幂和]JZOJ 4220 WYF的盒子
    奇妙的骚操作
    [树形DP][概率期望]JZOJ 4225 宝藏
    操作系统基础知识
    计算机硬件知识整理
    ORM的查询
    ORM的记录添加和删除
  • 原文地址:https://www.cnblogs.com/tele-share/p/10784332.html
Copyright © 2020-2023  润新知