优先级队列

栈与队列

旧巷老猫 提交于 2020-02-21 19:37:30
目录 1 栈的定义 2 栈的顺序存储结构及实现 2.1 栈的顺序存储结构 2.2 栈的顺序存储结构--进栈出栈操作 3 两栈共享空间 4 栈的链式存储结构及实现 4.1 栈的链式存储结构--进栈操作 4.2 栈的链式存储结构--出栈操作 5 栈的应用--四则运算表达式求值 5.1 后缀表达式计算结果 5.2 中缀表达式转后缀表达式 6 队列的定义 7 循环队列 7.1 队列顺序存储 7.2 循环队列定义 8 队列的链式存储结构及实现 8.1 队列的链式存储结构--入队操作 8.2 队列的链式存储结构--出队操作 1 栈的定义 栈是限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈,栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。 栈是一个线性表,栈元素具有线性关系,即前驱后继关系,栈的表尾是指栈顶,而不是栈底。栈底是固定的,最先进栈的只能在栈底,栈的插入操作,叫作进栈,栈的删除操作,叫作出栈。 2 栈的顺序存储结构及实现 2.1 栈的顺序存储结构 栈的顺序存储其实也是线性表存储的简化,称为顺序栈;线性表是用数组来实现的,下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底。 定义一个top变量指示栈顶元素在数组中的位置,若存储栈的长度为StackSize

RabbitMq客户端开发

巧了我就是萌 提交于 2020-02-18 19:32:43
目录 连接RabbitMQ 使用交换器和队列 exchangeDeclare方法详解 QueueDeclare方法详解 queueBind方法详解 exchangeBind方法详解 何时创建 发送消息 消费消息 推模式 拉模式 消费端的确认与拒绝 关闭连接 连接RabbitMQ 下面的代码(代码清单)用来在给定的参数(IP地址、端口号、用户名、密码等)下 连接RabbitMQ: 也可以选择使用URI的方式来实现 Connection可以用来创建多个Channel实例,但是Channel实例不能在线程间共享, 应用程序应该为每一个线程开辟一个Channel。 某些情况下Channel的操作可以并发运行,但 是在其他情况下会导致在网络上出现错误的通信帧交错,同时也会影响发送方确认(publisher confmn)机制的运行(详细可以参考4.8节),所以 多线程间共享Channel实例是非线程安全的 。 Channel或者Connection中有个isOpen方法可以用来检测其是否已处于开启状态。但并 不推荐在生产环境的代码上使用 isOpen方法,这个方法的返回值依赖于shutdownCause (参考下面的代码)的存在,有可能会产生竞争 ,代码清单是isOpen方法的源码: 错误地使用isOpen方法示例代码如代码清单所示。 通常情况下

阻塞队列

帅比萌擦擦* 提交于 2020-02-17 20:04:37
阻塞队列 何为阻塞队列 何为阻塞队列?阻塞队列是一个队列,数据结构如下图所示: 线程1往队列里面添加元素,线程2从队列里面移除元素 当队列为空时,从队列中获取元素的操作将会阻塞 当队列是满时,从队列中添加元素的操作将会被阻塞 试图从空的队列中获取元素的线程将会被阻塞,直到其他线程往空的队列中添加元素 试图向已满的队列中添加新元素的线程将会被阻塞,直到其他线程从队列中移除一个或多个元素或者完全清空,使队列变得空闲起来并后续新增 阻塞队列的用处 在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动 被唤起 为什么需要BlockingQueue? 好处是我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQueue都给你一手包办了, 在concurrent包发布以前,在多线程环境下, 我们每个程序员都必须自己去控制这些细节,尤其还要监护效率和线程安全 ,而这会给我们的程序带来不小的复杂性. BlockingQueue java并发包中提供了一个比较重要的阻塞队列接口供我们使用.该接口的UML图片如下: ArrayBlockingQueue:由数据结构组成的有界阻塞队列 LinkedBlockingQueue:由链表结构组成的有界(但大小默认值为Integer.MAX_VALUE)阻塞队列 PriorityQueue

多线程同步和优先级队列(Queue)

假如想象 提交于 2020-02-17 15:30:32
线程同步 如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。 使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire 和 release 方法之间。如下: 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样)。但是当线程需要共享数据时,可能存在数据不同步的问题。 考虑这样一种情况:一个列表里所有元素都是0,线程"set"从后向前把所有元素改成1,而线程"print"负责从前往后读取列表并打印。 那么,可能线程"set"开始改的时候,线程"print"便来打印列表了,输出就成了一半0一半1,这就是数据的不同步。为了避免这种情况,引入了锁的概念。 锁有两种状态——锁定和未锁定。每当一个线程比如"set"要访问共享数据时,必须先获得锁定;如果已经有别的线程比如"print"获得锁定了,那么就让线程"set"暂停,也就是同步阻塞;等到线程"print"访问完毕,释放锁以后,再让线程"set"继续。 经过这样的处理,打印列表时要么全部输出0,要么全部输出1,不会再出现一半0一半1的尴尬场面。 实例: #!/usr/bin/python3 import time import

python多线程

蓝咒 提交于 2020-02-17 15:29:49
一、多线程类似于同时执行多个不同程序,多线程运行有如下优点:   1.使用线程可以把耗时任务放到后台去处理。   2.用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度   3.程序的运行速度可能加快   4.在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。 二、多线程的特点   线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。   线程可以被抢占(中断)。   在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) -- 这就是线程的退让。 三、线程的创建 python实现多线程有两种方式(函数,用类来包装线程对象) 1、函数式:调用thread模块中的start_new_thread()函数来产生新线程 import timeimport _threaddef func(thread,delay): for x in range(5): time.sleep(delay) print("%d正在执行线程%s"%(x,thread)) if x==4: _thread.exit()try: _thread.start_new_thread(func, ("thread_1",2) ) _thread.start_new

Java多线程(三)

为君一笑 提交于 2020-02-13 22:35:08
个人博客 http://www.milovetingting.cn Java多线程(三) 前言 本文为学习Java相关知识所作笔记,参考以下资料: https://github.com/Snailclimb/JavaGuide ,感谢原作者的分享! 线程基本方法 线程相关的基本方法有 wait,notify,notifyAll,sleep,join,yield 等。 线程等待(wait) 调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知或被中断才会返回,需要注意的是调用 wait()方法后,会释放对象的锁。因此,wait 方法一般用在同步方法或同步代码块中。 线程睡眠(sleep) sleep 导致当前线程休眠,与 wait 方法不同的是 sleep 不会释放当前占有的锁,sleep(long)会导致线程进入 TIMED-WATING 状态,而 wait()方法会导致当前线程进入 WATING 状态 线程让步(yield) yield 会使当前线程让出 CPU 执行时间片,与其他线程一起重新竞争 CPU 时间片。一般情况下,优先级高的线程有更大的可能性成功竞争得到 CPU 时间片,但这又不是绝对的,有的操作系统对线程优先级并不敏感。 线程中断(interrupt) 中断一个线程,其本意是给这个线程一个通知信号,会影响这个线程内部的一个中断标识位

取自阿里的15道Java并发编程常见面试题

橙三吉。 提交于 2020-02-13 13:19:56
最近有朋友去阿里面试回来和我聊天,他的简历之前我看过,在一家传统企业做后端开发的,有3年的工作经验,但是对于并发相关的经验不是很足。 在看过他的简历之后,我建议他看一些和并发有关的东西,但是他并没有听,回来之后找我吐槽: “我都明确说了自己没有并发编程经验,但是面试官还是抓着我问了很多相关的问题…” 然后说: “早知道我就听你的多看一些相关的知识了…” "可是我真的没有经验那,看了理论知识真的有用吗? " 对于他的这一连串问题,我只能说: 早就告诉你了你不听,我能怎么办。 以下,就是他事后靠回忆记起来的部分面试题,希望能够对你有所帮助 1、线程与进程的区别? 进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元。 一个程序至少有一个进程,一个进程至少有一个线程。 2、什么是多线程中的上下文切换? 多线程会共同使用一组计算机上的CPU,而线程数大于给程序分配的CPU数量时,为了让各个线程都有执行的机会,就需要轮转使用CPU。不同的线程切换使用CPU发生的切换数据等就是上下文切换。 3、死锁与活锁的区别,死锁与饥饿的区别? 死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 产生死锁的必要条件: 互斥条件:所谓互斥就是进程在某一时间内独占资源。 请求与保持条件:一个进程因请求资源而阻塞时

复习打卡--0823 队列和多进程

北城以北 提交于 2020-02-13 02:33:44
一、队列 Python的Queue模块中提供了同步的、线程安全的队列类,包括 FIFO (先入先出)队列 Queue , LIFO (后入先出)队列 LifoQueue ,和优先级队列 PriorityQueue 。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。 queue.Queue(maxsize=0) maxsize默认为0,不设置或设置为负数时,表示可接受的消息数量没有上限。 常用方法: Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。 Queue.join() 实际上意味着等到队列为空,再执行别的操作 Queue.put(item,block=True, timeout=None) 写入队列,block=True,Timeout=3 意味着等待3s,队列仍没有位置就报错;block=False 意思是不等待,队列如果满了直接报错; Queue.get(block=True, timeout=None) 获取队列,block和timeout参数说明同上put Queue.get_nowait() 相当于Queue.get(block=False),不等待 Queue

数据结构之队列(链式存储),实现优先队列

我们两清 提交于 2020-02-12 02:30:56
我们在打王者或者英雄联盟时,游戏中的防御塔总是先打大炮车,打完大炮车再打小兵。这里就用到优先队列,大炮车的优先级高,小兵的优先级低,所有防御塔会优先打大炮车。 优先队列大部分和链式队列一样,只是出队方式和链式队列骚骚有点区别。 不说了,上代码 # include <iostream> # define MAX_SIZE 5 using namespace std ; typedef int DataType ; typedef struct _QNode { int priority ; DataType data ; struct _QNode * next ; } QNode ; typedef QNode * QueuePtr ; typedef struct { int length ; QueuePtr front ; QueuePtr rear ; } LinkQueue ; //初始化 bool initQueue ( LinkQueue * & LQ ) { LQ = new LinkQueue ; if ( ! LQ ) return false ; LQ -> length = 0 ; LQ -> front = LQ -> rear = NULL ; return true ; } //判断是否为空 bool isEmpty ( LinkQueue * &

iOS之多线程

痞子三分冷 提交于 2020-02-10 00:29:07
首先,在了解多线程之前要了解什么是进程,什么是线程 进程是指在系统中正在运行的一个应用程序。每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。 一个进程要想执行任务,必须得有至少一个线程,线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行。 一个线程中任务的执行是串行的,如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务。也就是说,在同一时间内,1个线程只能执行1个任务。 什么是多线程? 即在一个进程(程序)中可以开启多条线程,每条线程可以并行(同时)执行不同的任务。 并行即同时执行。比如同时开启3条线程分别下载3个文件(分别是文件A、文件B、文件C)。 在同一时间里,CPU只能处理一条线程,只有一条线程在工作(执行)。多线程并发(同时)执行,其实是CPU快速地在多条线程之间快速切换,如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象。 多线程优缺点 优点: 能适当提高程序的执行效率。 能适当提高资源利用率(CPU、内存利用率) 缺点: 开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能。 线程越多,CPU在调度线程上的开销就越大。 程序设计更加复杂:比如线程之间的通信、多线程的数据共享 开启多线程的方式 当一个iOS程序运行后