算法 栈和队列

1. 栈

  • 类似于一个口的客栈,先进去的后出来,后进去的先出来,代码实现如下:
  • Stack() 创建一个空的新栈。 它不需要参数,并返回一个空栈。
  • push(item)将一个新项添加到栈的顶部。它需要 item 做参数并不返回任何内容。
  • pop() 从栈中删除顶部项。它不需要参数并返回 item 。栈被修改。
  • isEmpty() 测试栈是否为空。不需要参数,并返回布尔值。
  • size() 返回栈中的 item 数量。不需要参数,并返回一个整数。
class Stack():
    def __init__(self): # 实例化一个空栈
        self.items = [] # 容器
    def push(self,item): # item就是向栈中添加的元素(从栈顶添加到栈底)
        self.items.append(item)
    def pop(self):
        return self.items.pop()
    def isEmpty(self):
        return self.items == []
    def size(self):
        return len(self.items)
# 实例化一个空栈
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)

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

2. 队列

  • 类似于两个口的胡同,一个只进,一个只出,且先进的先出,代码如下:
  • Queue() 创建一个空的新队列。 它不需要参数,并返回一个空队列。
  • enqueue(item) 将新项添加到队尾。 它需要 item 作为参数,并不返回任何内容。
  • dequeue() 从队首移除项。它不需要参数并返回 item。 队列被修改。
  • isEmpty() 查看队列是否为空。它不需要参数,并返回布尔值。
  • size() 返回队列中的项数。它不需要参数,并返回一个整数。
# 队列实现思路:先进先出,将元素存于列表中,添加时永远插在索引为0的位置,取出时永远取索引的最后一个
class Queue():
    def __init__(self):     # 实例化一个空队列
        self.items = []
    def enqueue(self,item):  # 添加元素
        self.items.insert(0,item)
    def dequeue(self):      # 取元素
        return self.items.pop()
    def isEmpty(self):      # 是否为空
        return self.items == []
    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())
  • 应用场景:

    • 我们的计算机实验室有 30 台计算机与一台打印机联网。当学生想要打印时,他们的打印任务与正在等待的所有其他打印任务“一致”。第一个进入的任务是先完成。如果你是最后一个,你必须等待你前面的所有其他任务打印
  • 案例:烫手的山芋
    • 烫手山芋游戏介绍:6个孩子围城一个圈,排列顺序孩子们自己指定。第一个孩子手里有一个烫手的山芋,需要在计时器计时1秒后将山芋传递给下一个孩子,依次类推。规则是,在计时器每计时7秒时,手里有山芋的孩子退出游戏。该游戏直到剩下一个孩子时结束,最后剩下的孩子获胜。请使用队列实现该游戏策略,排在第几个位置最终会获胜。
    • 关键因素:
      • 必须要保证手里有山芋的孩子永远在队头的位置

        • 结论:

          • 计时器计时7秒或者山芋被传递6次则一轮游戏结束,淘汰一个孩子,游戏继续。
# 队列实现思路:先进先出,将元素存于列表中,添加时永远插在索引为0的位置,取出时永远取索引的最后一个
class Queue():
    def __init__(self):     # 实例化一个空队列
        self.items = []
    def enqueue(self,item):  # 添加元素
        self.items.insert(0,item)
    def dequeue(self):      # 取元素
        return self.items.pop()
    def isEmpty(self):      # 是否为空
        return self.items == []
    def size(self):         # 判断长度
        return len(self.items)
kids = [‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘]
# 将孩子加入到队列中
kids_queue = Queue()  # 实例化一个空队列
for kid in kids:
    kids_queue.enqueue(kid)

while kids_queue.size() > 1:  # 长度为1时结束
    for i in range(6):
        first_kid = kids_queue.dequeue()
        kids_queue.enqueue(first_kid)
    # 6次传递结束之后需要将队头孩子删除出队列
    kids_queue.dequeue()
print(‘获胜的孩子是:‘,kids_queue.dequeue())

原文地址:https://www.cnblogs.com/lvweihe/p/12642645.html

时间: 2024-10-17 10:04:26

算法 栈和队列的相关文章

数据结构与算法--栈、队列(队列)

Hello,everybody.我们又见面了.今天我们来学习一下队列这个数据结构,let's Go,开始我们的征程吧. 首先,举两个生活中的常见例子.相信大家,在用电脑工作娱乐时,都会碰到这样的现象.当我们点击程序或进行其他操作时,电脑处于死机状态.正当我们准备Reset时,它突然像打了鸡血似的,突然把刚才我们的操作,按顺序执行了一遍.之所以会出现这个现象,是因为操作系统的多个程序,需要通过一个管道输出,而按先后顺序排队造成的. 还有有个例子,在我们打客服热线时,有时会出现等待的现象.当其他客户

算法 - 栈与队列(C 语言实现)

目标: 理解 栈 与 队列 这两种数据结构, 并且知道如何应用. 算法 + 数据结构 = 程序 一.堆栈 堆栈是一组元素的集合,类似于数组,但数组可以按下标访问,堆栈的访问规则只能为push 与 pop 两种操作. 堆栈只能访问或者移出栈顶的元素.

算法-栈,队列

常见的栈与队列算法题 1.使用队列实现栈 2.使用栈实现队列 3.包含最小值函数的栈 4.合法的出栈序列 5.简单计算器 1.队列实现栈 class MyStack { public: /** Initialize your data structure here. */ MyStack() { } /** Push element x onto stack. */ void push(int x) { int len=data.size(); data.push(x); while(len>0

数据结构与算法-栈和队列

一.简介 众所周知,线性表是数据结构的基础,通常有两种实现方式:数组和链表.栈和队列是最常用的数据结构,它们基于线性表实现. 二.栈 定义:栈是限定仅在表尾进行插入和删除操作的线性表,即FILO. 栈被经常类比于弹夹,即先被压如弹夹的子弹最后被打出.根据线性表的实现方式得知,栈的实现方式有两种:数组实现和链表实现. 栈的数组实现: package basic.data_structure.cha01; /** * 栈:先进后出(FILO),只允许在栈顶操作元素 * 栈的基本操作: * 初始化栈.

Java数据结构与算法-栈和队列

(摘录加总结)------ 栈和队列不属于基础的数据结构,它们都属于线性表. 一.栈 对于栈存储操作元素只能在栈结构的一端进行元素的插入和删除,是一种性质上的线性表结构.按照“先进后出”的原则进行存储数据.先进的元素在栈底,后进的元素在栈顶.需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来).比较常规的说明是:栈底固定,而栈顶浮动:栈中元素个数为零时称为空栈.插入一般称为进栈(PUSH),删除则称为退栈(POP). 栈的实现结构包括顺序结构实现和链式结构实现.前者依据的是数组,后者

【内功】基础算法——栈和队列

1.  单调栈 它能解决问题就是在 O(N) 的时间复杂度内,找到离一个数数最近的左右两个比它大或者小(或者说更强的数)(找比它大的数的时候,强就是比它大,同理小也一样). 不要求是数组,数据流也一样的. 比如说给了一个数组,找到一个数离它最近的最大的左右两个数.eg, [1, 3, 2, 0, 9, 3, 4, 6]  比如找 离 4 最近的比它大的左右两个数字就是  [9, 6] 2. 单调队列 原文地址:https://www.cnblogs.com/zhangwanying/p/1003

图解堆算法、链表、栈与队列(Mark)

原文地址: 图解堆算法.链表.栈与队列(多图预警) 堆(heap),是一类特殊的数据结构的统称.它通常被看作一棵树的数组对象.在队列中,调度程序反复提取队列中的第一个作业并运行,因为实际情况中某些时间较短的任务却可能需要等待很长时间才能开始执行,或者某些不短小.但很重要的作业,同样应当拥有优先权.而堆就是为了解决此类问题而设计的数据结构.--

数组拷贝、数组函数、通过数组函数来模拟数据结构的栈和队列、回调的意义、数组函数的排序问题、算法以及寻找素数的筛选法

1.数组的拷贝数组拷贝时指针的指向问题. 数组在拷贝时,指针的位置随之复制[这一点拷贝是完全一样]但是如果拷贝的数组的指针是非法的,那么拷贝出新指针的位置进行初始化<?php$arr1=array('123');end($arr1);next($arr1);//这个指针非法$arr2 = $arr1;//这里进行数组的拷贝var_dump(current($arr2));//得到指向‘123’元素的指针var_dump(current($arr1));//此时这个数组的指针有问题?> 但是拷贝

用JS描述的数据结构及算法表示——栈和队列(基础版)

前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里隐隐歌颂大神的厉害,然后别人的厉害不是我的,所以到底看得各种受打击+头昏脑涨,写这个系列是希望自己能够总结学到东一块.西一下的知识,因为水平有限+经验不足,所以在此只说最基础的思想,附上我自己的算法实现(肯定还有更优解),如果要想看进阶版的,可以在园里搜“数据结构”,各种语言实现和进阶提升的文章有很