zoukankan      html  css  js  c++  java
  • python 栈和队列的基本实现

    python中的列表结构可以用来实现栈和队列。

    】:

      栈是一种数据结构,具有先入后出的特点,并且栈的所有操作只能在某一端进行,能进行操作的一端的第一个元素称为栈顶,另一端的第一个元素称为栈底

      栈的五种基本方法:

        push: 元素进栈

        pop:  元素出栈,删除栈顶元素,并返回该元素

        isEmpty: 判断栈是否为空;栈为空,返回True;栈不为空,返回False

        peek: 访问栈顶元素

        length: 返回栈中元素的个数

     1 class Stack():
     2     def __init__(self):
     3         self.stack = []
     4 
     5     def push(self, data):
     6         self.stack.append(data)
     7 
     8     def pop(self):
     9         if not self.isEmpty():
    10             return self.stack.pop()
    11         else:
    12             print('StackError: fail to pop, the stack is empty.')
    13 
    14     def isEmpty(self):
    15         return self.length() == 0
    16 
    17     def peek(self):
    18         if not self.isEmpty():
    19             return self.stack[-1]
    20         else:
    21             print("The stack is empty.")
    22 
    23     def length(self):
    24         return len(self.stack)

    队列】:

      队列是一种数据结构,具有先入先出的特点,元素的插入和删除分别在不同的端进行,能够插入元素的队列一端称为队尾,另一端只能删除元素,称为队首

      队列的五种基本操作:

        push: 从队尾插入元素

        pop:  从队首删除元素

        isEmpty: 判断队列是否为空

        peek: 访问队首元素

        length: 获取队列中元素个数

     1 class Queue():
     2     def __init__(self):
     3         self.queue = []
     4 
     5     def push(self, data):
     6         self.queue.append(data)
     7 
     8     def pop(self):
     9         if not self.isEmpty():
    10             return self.queue.pop(0)
    11         else:
    12             print('StackError: fail to pop, the stack is empty.')
    13 
    14     def isEmpty(self):
    15         return self.length() == 0
    16 
    17     def peek(self):
    18         if not self.isEmpty():
    19             return self.queue[0]
    20         else:
    21             print("The queue is empty.")
    22 
    23     def length(self):
    24         return len(self.queue)

    双端队列】:

      deque模块是Python标准库collections中的一个内置模块,实现双端队列的功能,在队列的两端都可以进行插入和删除

      使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。

      deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:

      deque的种基本操作:

        append: 入队,从队列右端插入一个元素

        appendleft: 入队,从队列左端删除一个元素

        extend: 迭代处理其输入,对每个元素完成与append()相同的处理

        extendleft: 迭代处理其输入,对每个元素完成与appendleft()相同的处理

        pop: 出队,从队列右端删除一个元素,并返回该元素

        popleft: 出队,从队列左端删除一个元素,并返回该元素

        rotate:将队列的某些元素按某一方向进行旋转

     1 from collections import deque
     2 queue = deque() 
     3 queue = deque(maxlen=n)   # 限制queue的最大长度为n 
     4 queue.append('one')       # deque(['one'])
     5 queue.appendleft('two')   # deque(['two', 'one'])
     6 queue.extend('three')     # deque(['two', 'one', 't', 'h', 'r', 'e', 'e'])
     7 queue.extendleft('four')  # deque(['r', 'u', 'o', 'f', 'two', 'one', 't', 'h', 'r', 'e', 'e'])
     8 queue.pop()               # deque(['r', 'u', 'o', 'f', 'two', 'one', 't', 'h', 'r', 'e'])
     9 queue.popleft()           # deque(['u', 'o', 'f', 'two', 'one', 't', 'h', 'r', 'e'])
    10 queue.rotate(2)           # deque(['r', 'e', 'u', 'o', 'f', 'two', 'one', 't', 'h']) ,参数为正数n时,将右端的n个元素依次插入到左端
    11 queue.rotate(-3)          # deque(['o', 'f', 'two', 'one', 't', 'h', 'r', 'e', 'u']) ,参数为负数n时,将左端的n个元素依次插入到右端

    参考博文: https://www.jb51.net/article/88139.htm

          https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431953239820157155d21c494e5786fce303f3018c86000

          https://docs.python.org/3/library/collections.html#collections.deque
  • 相关阅读:
    Iphone和iPad适配, 横竖屏
    JSONModel
    iPhone socket 编程之BSD Socket篇
    UIImageView 动画 / UIImage 方向
    iOS团队开发者测试
    xcode6以后, 使用.pch
    C# new override
    MVC, MVP, MVVM
    VS2010 VC Project的default Include设置
    centos 7 安装mysql5.6rpm格式197
  • 原文地址:https://www.cnblogs.com/OoycyoO/p/9883561.html
Copyright © 2011-2022 走看看