精华内容
下载资源
问答
  • 链队列的初始化 判断队列是否为空 入队列 出队列 等等操作先上个示意图(图片来源 严蔚敏版数据结构) 可能更好理解 1 // 2 // main.cpp 3 // WWLinkQueueBasic 4 // 5 // Created by Live on 2017/8/22. 6 ...

    链队列的初始化 判断队列是否为空 入队列 出队列 等等操作先上个示意图(图片来源 严蔚敏版数据结构) 可能更好理解
    1
    // 2 // main.cpp 3 // WWLinkQueueBasic 4 // 5 // Created by Live on 2017/8/22. 6 // Copyright © 2017年 ITCoderW. All rights reserved. 7 // 8 //参考书籍:严蔚敏版数据结构 数据结构高分阅读等 9 10 #include <iostream> 11 using namespace std; 12 13 #define maxSize 1000 14 #define WWStr(str) #str 15 #define WWLine "-------------" 16 17 18 /** 19 链队列结点结构体 20 */ 21 typedef struct LinkQueueNode{ 22 int data; //数据域 23 struct LinkQueueNode *next; //指针域 24 }LinkQueueNode; 25 26 27 /** 28 链队列类型定义(只有一个头尾指针而已) 29 */ 30 typedef struct{ 31 LinkQueueNode *front; //链队列头指针 32 LinkQueueNode *rear; //链队列尾指针 33 }LinkQueue; 34 35 36 /** 37 链队列相关操作 38 */ 39 void linkQueueOperation(); 40 /** 41 初始化链队列 42 43 @param linkQueue 链队列linkQueue 44 */ 45 void initLinkQueue(LinkQueue *&linkQueue); 46 47 /** 48 判断链队列是否为空 49 50 @param linkQueue 链队列 51 */ 52 53 /** 54 判断链队列是否为空 55 56 @param linkQueue 链队列 57 @return 为空返回1 不为空返回0 58 */ 59 int isEmptyLinkQueue(LinkQueue *linkQueue); 60 61 /** 62 入队列 63 64 @param linkQueue 链队列 65 @param x 要入队列的元素 66 */ 67 void enLinkQueue(LinkQueue *linkQueue,int x); 68 #pragma mark - 出队列 69 70 /** 71 链队列出队列 72 73 @param linkQu 要出队列的链队列 74 @param x 返回出队列的数据域的值 75 @return 返回能否出队列 76 */ 77 int outLinkQueue(LinkQueue *linkQu,int &x); 78 79 int main(int argc, const char * argv[]) { 80 linkQueueOperation(); 81 return 0; 82 } 83 84 85 #pragma mark - 链队列相关操作 86 void linkQueueOperation(){ 87 88 LinkQueue *linkQueue; 89 initLinkQueue(linkQueue); 90 isEmptyLinkQueue(linkQueue); 91 //1 2 3 依次入队列 92 enLinkQueue(linkQueue, 1); 93 enLinkQueue(linkQueue, 2); 94 enLinkQueue(linkQueue, 3); 95 // 96 int currentFrontData; 97 outLinkQueue(linkQueue, currentFrontData); 98 outLinkQueue(linkQueue, currentFrontData); 99 outLinkQueue(linkQueue, currentFrontData); 100 101 outLinkQueue(linkQueue, currentFrontData); 102 103 enLinkQueue(linkQueue, 4); 104 outLinkQueue(linkQueue, currentFrontData); 105 106 107 } 108 109 #pragma mark - 初始化链队列 110 void initLinkQueue(LinkQueue *&linkQueue){ 111 112 cout<<WWLine<<WWStr(链队列初始化操作地址)<<&linkQueue<<WWLine<<endl; 113 //之前一直是笔误导致了下边的这种情况的发生 还找了半天错 所以以后的话最好要注意别把参数名和类型的名字写得太像 114 // linkQueue = (linkQueue *)malloc(sizeof(linkQueue)); 115 linkQueue = (LinkQueue *)malloc(sizeof(LinkQueue)); 116 linkQueue->front = NULL; 117 linkQueue->rear = linkQueue->front; 118 119 } 120 121 #pragma mark - 判断队列是否为空 122 int isEmptyLinkQueue(LinkQueue *linkQueue){ 123 cout<<WWLine<<WWStr(判断链队列是否为空 队列地址)<<&linkQueue<<WWLine<<endl; 124 if (linkQueue->front == NULL || linkQueue->rear == NULL) { 125 return 1; 126 } 127 return 0; 128 } 129 130 #pragma mark - 入队列 131 void enLinkQueue(LinkQueue *linkQueue,int x){ 132 cout<<WWLine<<WWStr(进入链队列地址)<<linkQueue<<WWLine<<endl; 133 134 cout<<WWStr(当前入队列的元素)<<x<<endl; 135 LinkQueueNode *Node = (LinkQueueNode*)malloc(sizeof(LinkQueueNode)); 136 Node->data = x; 137 Node->next = NULL; 138 139 if(isEmptyLinkQueue(linkQueue)){ 140 //如果入的是空队列 则新结点是队首结点也是队列尾结点 141 linkQueue->front = Node; 142 linkQueue->rear = linkQueue->front; 143 }else{ 144 //将新结点链到队列尾部 rear指向它 145 linkQueue->rear->next = Node; 146 linkQueue->rear = Node; 147 } 148 149 } 150 151 #pragma mark - 出队列 152 int outLinkQueue(LinkQueue *linkQu,int &x){ 153 cout<<WWLine<<WWStr(出队列链队列地址)<<linkQu<<WWLine<<endl; 154 155 if (isEmptyLinkQueue(linkQu)) { 156 //链队列为空不能够出队列 157 cout<<WWStr(链队列为空,不能出队列)<<endl; 158 return 0; 159 } 160 161 //把当前链队列的头的数据赋值给x 162 LinkQueueNode *Node = linkQu->front; 163 x = Node->data; 164 165 cout<<WWStr(当前出队列的元素:)<<x<<endl; 166 167 //移动指针 如果有的话 front指向下一个结点 168 if(linkQu->front == linkQu->rear){ 169 linkQu->front = NULL; 170 linkQu->rear =NULL; 171 }else{ 172 linkQu->front = linkQu->front->next; 173 } 174 free(Node); 175 return 1; 176 }


    运行结果如下:

    -------------链队列初始化操作地址0x7fff5fbff618-------------

    -------------判断链队列是否为空队列地址0x7fff5fbff5c0-------------

    -------------进入链队列地址0x100202f90-------------

    当前入队列的元素1

    -------------判断链队列是否为空队列地址0x7fff5fbff560-------------

    -------------进入链队列地址0x100202f90-------------

    当前入队列的元素2

    -------------判断链队列是否为空队列地址0x7fff5fbff560-------------

    -------------进入链队列地址0x100202f90-------------

    当前入队列的元素3

    -------------判断链队列是否为空队列地址0x7fff5fbff560-------------

    -------------出队列链队列地址0x100202f90-------------

    -------------判断链队列是否为空队列地址0x7fff5fbff540-------------

    当前出队列的元素:1

    -------------出队列链队列地址0x100202f90-------------

    -------------判断链队列是否为空队列地址0x7fff5fbff540-------------

    当前出队列的元素:2

    -------------出队列链队列地址0x100202f90-------------

    -------------判断链队列是否为空队列地址0x7fff5fbff540-------------

    当前出队列的元素:3

    -------------出队列链队列地址0x100202f90-------------

    -------------判断链队列是否为空队列地址0x7fff5fbff540-------------

    链队列为空,不能出队列

    -------------进入链队列地址0x100202f90-------------

    当前入队列的元素4

    -------------判断链队列是否为空队列地址0x7fff5fbff560-------------

    -------------出队列链队列地址0x100202f90-------------

    -------------判断链队列是否为空队列地址0x7fff5fbff540-------------

    当前出队列的元素:4

    Program ended with exit code: 0

     

    如有错误 敬请指正

    如需转载 请注明出处 谢谢

    获取源码



     

    转载于:https://www.cnblogs.com/ITCoderW/p/7417997.html

    展开全文
  • 建筑考虑具有DB记录的系统....问题现场活动的数量变化很大,在高峰时段,消费者无法处理负载,并且队列被数千个项目堵塞.我想使系统自适应,以便生产者在队列为时不会向消费者发送新事件.我试过了什么>搜索K...

    建筑

    考虑具有DB记录的系统.每条记录都可以处于实时或过期状态;应使用外部软件模块定期处理实时记录.

    我使用Kombu和RabbitMQ的经典制作人 – 消费者架构解决了这个问题.生产者每隔几秒从DB中提取记录,消费者处理它们.

    问题

    现场活动的数量变化很大,在高峰时段,消费者无法处理负载,并且队列被数千个项目堵塞.

    我想使系统自适应,以便生产者在队列为空时不会向消费者发送新事件.

    我试过了什么

    >搜索Kombu文档/ API

    >检查Queue对象

    >使用RabbitMQ REST API:http://< host>:< port / api / queues /< vhost> /< queue_name>.它有效,但它是另一种维护机制,我更喜欢Kombu中的优雅解决方案.

    如何使用Python的Kombu检查RabbitMQ是否为空?

    最佳答案 您可以在kombu Queue对象上调用queue_declare().

    根据docs函数返回:

    Returns a tuple containing 3 items:

    the name of the queue (essential for automatically-named queues)

    message count

    consumer count

    因此你可以这样做:

    name, msg_count, consumer_count = queue.queue_declare()

    展开全文
  • 一、QueueQueue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递队列在多线程中可以共享,替代全局变量,无需加互斥...

    一、Queue

    Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递

    队列在多线程中可以共享,替代全局变量,无需加互斥锁。

    队列可以并发的派多个线程,对排列的线程处理,并且每个需要处理线程只需要将请求的数据放入队列容器的内存中,线程不需要等待,当排列完毕处理完数据后,线程再准时来取数据即可。请求数据的线程只与这个队列容器存在关系,处理数据的线程down掉不会影响到请求数据的线程,队列会派给其他线程处理这分数据,它实现了解耦,提高效率。

    队列内会有一个有顺序的容器,列表与这个容器是有区别的,列表中数据虽然是排列的,但数据被取走后还会保留,而队列中这个容器的数据被取后将不会保留。当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用。

    二、Python四种类型的队例:

    Queue:FIFO 即first in first out 先进先出

    LifoQueue:LIFO 即last in first out 后进先出

    PriorityQueue:优先队列,级别越低,越优先

    deque:双边队列

    from queue import Queue, LifoQueue, PriorityQueue

    1、Queue 先进先出队列:

    q = Queue(maxsize=5)

    初始化一个队列,默认是不限定队列的长度,也可以通过参数指定队列中数据的maxsize,如果maxsize小于或者等于0,队列大小没有限制。

    put(i,timeout=2) 方法向队列中添加元素,timeout以设置队列中数据满了之后的等待时间(默认一直等待)

    q.put(999, block=False) # block=False,往队列中添加数据,不等待,如果队列中数据已满,则会报错

    from queue import Queue

    q = Queue(maxsize=5) #限定最长为5

    for i in range(5):

    q.put(i,timeout=2)

    print(q)

    while not q.empty():

    print(q.get())

    #输出

    0

    1

    2

    3

    4

    2、LifoQueue 后进先出队列:

    创建队列和向队列中添加元素与先进先出队列完全一致

    from queue import LifoQueue

    q = LifoQueue(5)

    for i in range(5):

    q.put(i,timeout=2)

    print(q)

    while not q.empty():

    print(q.get())

    #输出

    4

    3

    2

    1

    0

    3、优先队列:

    from queue import PriorityQueue

    import random

    q = PriorityQueue(5)

    for i in range(5):

    x = random.randint(1,99)

    q.put((x,f"{i}a"),timeout=2)

    print(q)

    while not q.empty():

    print(q.get())

    #输出

    (37, '1a')

    (44, '2a')

    (52, '4a')

    (76, '3a')

    (77, '0a')

    put传递的第一个参数为元组,元组的第一个元素表示数据的优先级

    队列中的数据为元组类型:元组的第一个元素表示数据的优先级,优先级越小的先出来

    关于优先级,尽量使用数值,如果全是字符串,会按ASCII码进行排序

    通用方法

    1、往队列中添加数据:q.put( item, block=True, timeout=None)

    item为添加的对象

    True 往队列中添加数据,如果队列中数据已满,一直等待

    bloke=False,往队列中添加数据,不等待,如果队列中数据已满,则报错

    timeout不设置,一直等待

    timeout设置后等待超过时间则报错

    其非阻塞版本为`put_nowait`等同于put(item, block=False)

    2、从队列中移除并返回一个数据:q.get([block[, timeout]])

    block和timeout用法与put一致

    其非阻塞方法为`get_nowait()`相当与get(block=False)

    3、判断队列中数据是否为空:empty方法 q.empty()

    队列中数据为空,返回True

    队列中数据不为空,返回False

    4、判断队列中数据是否已满:full q.full()

    队列中数据已满,返回True

    队列中数据不满,返回False

    5、获取队列中任务数量(多少条数据) q.qsize()

    6、task_done()

    意味着之前入队的一个任务已经完成。由队列的消费者线程调用。每一个get()调用得到一个任务,接下来的task_done()调用告诉队列该任务已经处理完毕。

    如果当前一个join()正在阻塞,它将在队列中的所有任务都处理完时恢复执行(即每一个由put()调用入队的任务都有一个对应的task_done()调用)。

    7、join()

    阻塞调用线程,直到队列中的所有任务被处理掉。

    只要有数据被加入队列,未完成的任务数就会增加。当消费者线程调用task_done()(意味着有消费者取得任务并完成任务),未完成的任务数就会减少。当未完成的任务数降到0,join()解除阻塞。

    展开全文
  • 一 前言本篇内容关于python队列的一些小知识,读者们抽空就看看吧!公众号:知识追寻者知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)二 队列介绍队列的常用方法put(item, ...

    一 前言

    本篇内容关于python队列的一些小知识,读者们抽空就看看吧!

    公众号:知识追寻者

    知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)

    二 队列介绍

    队列的常用方法

    put(item, block=True, timeout=None)存值;如果设置 block = True, timeout=None(默认) ,等待获取空闲的插槽入值;block =False ,立即获取插槽,否则抛出Full异常;如果timeout设置值,如果没有在规定时间内没有获取空闲的插槽抛出Full异常

    get(block=True, timeout=None)取值;如果设置 block = True, timeout=None默认,等待获取值;如果设置block =False,立即获取值,如果未拿到值抛出 Empty异常;如果timeout设置值,在规定时间内未获取到值抛出Empty异常;

    empty()判断队列是否为空,返回布尔值;

    qsize()返回队列中元素个数

    join()等到队列为空,该行语句下面的语句才会执行

    full()检查队列是否已满,返回布尔值;

    put_nowait(item); 等同于 put(item, False).

    get_nowait(); 等同于 get(False) 。

    2.1 Queue(maxsize)

    Queue(maxsize);先进先出队列 First In First Out(FIFO),类比管道,乒乓球从一端进去,从一端出来,先进去球的先出来;maxsize 为队列最大值,当数量超过maxsize值时队列进入阻塞状态;

    import queue

    que = queue.Queue(3)

    # 入队

    for num in range(3):

    que.put(num)

    # 出队

    for num in range(3):

    print(que.get())

    输出

    0

    1

    2

    2.2 LifoQueue(Queue)

    LifoQueue(Queue) ; 先进后出队列(FILO);类比叠盘子,先放的叠子位于底层,后放的叠子位于顶层,取叠子的时候自然先从顶层获取;

    que = queue.LifoQueue(3)

    # 入队

    for num in range(3):

    que.put(num)

    # 出队

    for num in range(3):

    print(que.get())

    输出

    2

    1

    0

    2.3 PriorityQueue(Queue)

    PriorityQueue(Queue);put进去的是一个元祖,(优先级,数据) ,数字越小,优先级越高,优先级越高,先出队列;

    que = queue.PriorityQueue(3)

    # 入队

    que.put((2,'z'))

    que.put((6,'x'))

    que.put((5,'q'))

    # 出队

    for num in range(3):

    print(que.get())

    输出

    (2, 'z')

    (5, 'q')

    (6, 'x')

    2.4 SimpleQueue

    SimpleQueue() 简单队列(FIFO); 没有大小限制,没有队列的一些高级功能;

    que = queue.SimpleQueue()

    # 入队

    for num in range(3):

    que.put(num)

    # 出队

    for num in range(3):

    print(que.get())

    输出

    0

    1

    2

    三 官方文档

    展开全文
  • 一、队列queue队列queue 多应用在多线程场景,多线程访问共享变量。对于多线程而言,访问共享变量时,队列queue的线程安全的。因为queue使用了一个线程锁(pthread.Lock()),以及三个条件变量(pthread.condition()),...
  • 我有一个令人尴尬的并行代码,它创建了一个数组列表,我想将它并行化(这是我第一次使用python的多处理,所以我仍然掌握了这些...我的作业似乎在执行并正确关闭,但是队列的,并且队列.get()不返回任何内容。我...
  • 1. //置空队列 2. void initQueue(LinkQueue &Q) 3. { 4. Q.rear = new QNode; 5. Q.rear->next = Q.rear;...8. //判断队列是否为空 9. int EmptyQueue(LinkQueue &Q) 10. { 11. ...
  • 分享给大家供大家参考,具体如下:队列的特征是:先进先出应用场景:消息通信、多进程间的协同、多线程间的协同等在队列中需要设计的实例属性:head节点、tail节点需要设计的实例方法有两个:分别是入队队列enqueue...
  • //链队列的基本操作   #include using namespace std; //节点的结构体 struct Node { int data; struct Node *next; }; //队列的结构体 struct queue { struct Node * front; struct Node *rear; };  //队列...
  • //是否为空 int IsEmpty(Queue* pQueue) {  return pQueue->nCount == 0?1:0;  } int main() {  Queue* MyQueue;  InitQueue(&MyQueue);  PushNode(MyQueue,1);  PushNode(MyQueue,4);  PushNode...
  • 怎么判断循环队列是否为空?或者已经满了?

    万次阅读 多人点赞 2017-03-29 18:39:28
    现有一个循环队列,其队头指针为 front,队尾指针为 rear,循环队列的总长度为 N,问怎么判断循环队列满了? 正确答案: D front==rear front==rear+1 ...当队列为空时,front指向队列的第
  • 当使用消息队列 Queue 的时候,如果 put() 之后直接用 empty() 方法,判断队列是否为空,多次运行,有时会返回True, 有时会返回False. 解决办法:加个 time.sleep(), 指定任意时间都可以。阻塞一下程序的执行。就会...
  • 2019-01-12 回答classlinkedlist//定义双项链表{chardata;linkedlistback;linkedlistforward;}interfaceaccess//定义从队列和栈存取操作的接口{voidput(charc);charget();}classqueueimplementsacc...
  • 数据结构 主讲人章万静 是 否 开始 结束 front==rear 定义变量 非空队列 空队列 循环队列判断队列空 获取头指针位置front 获取尾指针位置rear 循环队列判断队列空 判断循环队列是否为空很重要在出队列操作前必须判断...
  • 栈与队列主要是做程序员的工具来使用,它们主要做构思算法的辅助工具,而不是完全的数据存储工具。它们的生命周期比数组那些要短得多,在程序执行期间它们才会被创建,任务执行完就会被销毁。一 栈栈是一种只能...
  • 队列的应用场景银行叫号系统介绍1>队列是一个有序列表,可以用数组和链表...尾指针后移动rear+1,当rear=front为空2>若rear小于maxSize-1,则无法存入,队满代码实现//创建数组模拟队列编写一个类 class Ar...
  • 数组模拟环形队列对前面的数组模拟队列的优化,充分利用数组因此将...rear的含义做一个调整:rear初始值0,就是指向队列的最后一个元素的后一个位置,因为希望出一个空间作为约定//预留约定,画一个图尝试取模就...
  • 一:栈 栈和队列也是线性结构,线性表、栈和队列这三种数据结构的数据元素以及数据元素间的逻辑关系完全相同,差别是线性表的操作不受限制,而栈和队列的操作受到限制。栈的操作只能在表的一端进行,队列的插入操作...
  • 栈栈是一个「线性」的数据结构。栈最重要的特征是「只允许从一端...看到这里我们就能知道,由于入栈和出栈都在栈顶操作,所以插入或删除一个元素的复杂度O(1)。特殊情况下,当栈满的时候,再添加一个元素时,需要...
  • 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但...
  • 数据结构队列链表,此代码有初始化、入队、出队、判断是否为空,可以直接copy调试。 #include"stdio.h" #include"stdlib.h" typedef struct node * pointer; struct node{ int data; pointer next; }; ...
  • 队列的基本操作:初始化、入队、出队、遍历输出、判断是否为空判断是否满队 # include<stdio.h> # include<malloc.h> // 定义一个队列的类型 typedef struct Queue { int * pBase; // 指向数组的...
  • QT编程 判断QlineEdit是否为空

    万次阅读 2017-10-20 19:36:21
    直至为空,在处理系统消息的时候会产生新的Qt事件...接着,我们判断是否按下 if(lineEdit->text().isEmpty())//如果为空{...先处理Qt事件队列中的事件,直至为空。再处理系统...接着,我们判断是否按下 连接
  • //判断队列是否为空 if(q->rear == q->front) return -1; *data = q->data[q->front]; q->front = (q->front+1)%q->size; return 0; } 3.遍历 循环队列遍历还是有点意思的,所以这里实现了一个 /*...
  • 栈与队列--判断栈/队列为空/满

    万次阅读 2016-06-28 10:24:15
    完成int IsEmpty(Stack S)函数,该函数判断是否,如果返回1,否则返回0。 完成int IsFull(Stack S)函数,该函数判断是否已满,如果满返回1,否则返回0。typedef int ElemType; struct StackRecord; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,338
精华内容 935
关键字:

判断队列是否为空