zoukankan      html  css  js  c++  java
  • 栈+队列

    • 特性:先进后出的数据结构

    • 栈顶,栈尾

    • 应用:每个 web 浏览器都有一个返回按钮。当你浏览网页时,这些网页被放置在一个栈中(实际是网页的网址)。你现在查看的网页在顶部,你第一个查看的网页在底部。如果按‘返回’按钮,将按相反的顺序浏览刚才的页面。

    • Stack() 创建一个空的新栈。 它不需要参数,并返回一个空栈。

    • push(item)将一个新项添加到栈的顶部。它需要 item 做参数并不返回任何内容。

    • pop() 从栈中删除顶部项。它不需要参数并返回 item 。栈被修改。

    • peek() 从栈返回顶部项,但不会删除它。不需要参数。 不修改栈。

    • isEmpty() 测试栈是否为空。不需要参数,并返回布尔值。

    • size() 返回栈中的 item 数量。不需要参数,并返回一个整数。

    class Stack():
    
        # 以列表形式表达一个栈
        def __init__(self):
            self.items = []
    
        # push(item)将一个新项添加到栈的顶部。它需要 item 做参数并不返回任何内容。
        def push(self, item):
            self.items.append(item)
    
        # pop() 从栈中删除顶部项。它不需要参数并返回 item 。栈被修改。
        def pop(self):
            return self.items.pop()
    
        # peek() 从栈返回顶部项,但不会删除它。不需要参数。不修改栈。
        def peek(self):
            return len(self.items) - 1
    
        # isEmpty() 测试栈是否为空。不需要参数,并返回布尔值。
        def isEmpty(self):
            return self.items == []
    
        # size() 返回栈中的 item 数量。不需要参数,并返回一个整数。
        def size(self):
            return len(self.items)
    
    stack = Stack()
    stack.push(1)
    stack.push(2)
    stack.push(3)
    
    print('栈顶元素下标:',stack.peek())
    print(stack.isEmpty())
    print('元素个数:',stack.size())
    print(stack.pop())
    print(stack.pop())
    print(stack.pop())
    
    栈顶元素下标: 2
    False
    元素个数: 3
    3
    2
    1
    

    队列

    • 队列:先进先出

    • 应用场景:

      • 我们的计算机实验室有 30 台计算机与一台打印机联网。当学生想要打印时,他们的打印任务与正在等待的所有其他打印任务“一致”。第一个进入的任务是先完成。如果你是最后一个,你必须等待你前面的所有其他任务打印
    • Queue() 创建一个空的新队列。 它不需要参数,并返回一个空队列。

    • enqueue(item) 将新项添加到队尾。 它需要 item 作为参数,并不返回任何内容。

    • dequeue() 从队首移除项。它不需要参数并返回 item。 队列被修改。

    • isEmpty() 查看队列是否为空。它不需要参数,并返回布尔值。

    • size() 返回队列中的项数。它不需要参数,并返回一个整数。

    class Queue():
    
        def __init__(self):
            self.items = []
    
        # enqueue(item) 将新项添加到队尾。它需要 item 作为参数,并不返回任何内容。
        def enqueue(self, item):
            self.items.insert(0, item)
    
        # dequeue() 从队首移除项。它不需要参数并返回 item。 队列被修改。
        def dequeue(self):
            self.items.pop()
    
        # isEmpty() 查看队列是否为空。它不需要参数,并返回布尔值。
        def isEmpty(self):
            return self.items == []
    
        # size() 返回队列中的项数。它不需要参数,并返回一个整数。
        def size(self):
            return len(self.items)
    
    q = Queue()
    q.enqueue(1)
    q.enqueue(2)
    q.enqueue(3)
    print(q.dequeue())
    print(q.dequeue())
    print(q.dequeue())
    
    1
    2
    3
    
    • 案例:烫手的山芋
      • 烫手山芋游戏介绍:6个孩子围城一个圈,排列顺序孩子们自己指定。第一个孩子手里有一个烫手的山芋,需要在计时器计时1秒后将山芋传递给下一个孩子,依次类推。规则是,在计时器每计时7秒时,手里有山芋的孩子退出游戏。该游戏直到剩下一个孩子时结束,最后剩下的孩子获胜。请使用队列实现该游戏策略,排在第几个位置最终会获胜。
      • 准则:手里有山芋的孩子永远排在队列的头部
    kids = ['A', 'B', 'C', 'D', 'E', 'F']
    queue = Queue()
    for kid in kids:
        queue.enqueue(kid)
    while queue.size() > 1:
        for i in range(6): # 每循环一次,山芋传递一次,手里有山芋的孩子永远在对头位置
            kid = queue.dequeue()
            queue.enqueue(kid)
        queue.dequeue()
    print('获胜的选手是:', queue.dequeue())
    获胜的选手是:E
    

    双端队列

    • 同同列相比,有两个头部和尾部。可以在双端进行数据的插入和删除,提供了单数据结构中栈和队列的特性

    创建一个双端队列

    • Deque() 创建一个空的新 deque。它不需要参数,并返回空的 deque。
    • addFront(item) 将一个新项添加到 deque 的首部。它需要 item 参数 并不返回任何内容。
    • addRear(item) 将一个新项添加到 deque 的尾部。它需要 item 参数并不返回任何内容。
    • removeFront() 从 deque 中删除首项。它不需要参数并返回 item。deque 被修改。
    • removeRear() 从 deque 中删除尾项。它不需要参数并返回 item。deque 被修改。
    • isEmpty() 测试 deque 是否为空。它不需要参数,并返回布尔值。
    • size() 返回 deque 中的项数。它不需要参数,并返回一个整数。
    class Deque():
    
        def __init__(self):
            self.items = []
    
        # addFront(item) 将一个新项添加到 deque 的首部。它需要 item 参数 并不返回任何内容。
        def addFront(self, item):
            self.items.insert(0, item)
    
        # addRear(item) 将一个新项添加到 deque 的尾部。它需要 item 参数并不返回任何内容。
        def addRear(self, item):
            self.items.append(item)
    
        # removeFront() 从 deque 中删除首项。它不需要参数并返回 item。deque 被修改。
        def removeFront(self):
            del self.items[-1]
    
        # removeRear() 从 deque 中删除尾项。它不需要参数并返回 item。deque 被修改
        def removeRear(self):
            del self.items[0]
    
        # isEmpty() 测试 deque 是否为空。它不需要参数,并返回布尔值。
        def isEmpty(self):
            return len(self.items) == []
    
        # size() 返回 deque 中的项数。它不需要参数,并返回一个整数。
        def size(self):
            return len(self.items)
    
    q = Deque()
    q.addFront(1)
    q.addFront(2)
    q.addFront(3)
    
    print(q.removeRear())
    print(q.removeRear())
    print(q.removeRear())
    3
    2
    1
    
    • 双端队列应用案例:回文检查
      • 回文是一个字符串,读取首尾相同的字符,例如,radar toot madam。
  • 相关阅读:
    SQL Server, Timeout expired.all pooled connections were in use and max pool size was reached
    javascript 事件调用顺序
    Best Practices for Speeding Up Your Web Site
    C语言程序设计 使用VC6绿色版
    破解SQL Prompt 3.9的几步操作
    Master page Path (MasterPage 路径)
    几个小型数据库的比较
    CSS+DIV 完美实现垂直居中的方法
    由Response.Redirect引发的"Thread was being aborted. "异常的处理方法
    Adsutil.vbs 在脚本攻击中的妙用
  • 原文地址:https://www.cnblogs.com/5kuishoua666/p/12008610.html
Copyright © 2011-2022 走看看