队列的队列的数组实现
队列可以用数组Q[1…m]来存储,数组的上界m即是队列所容许的最大容量。在队列的运算中需设两个指针:head,队头指针,指向实际队头元素;tail,队尾指针,指向实际队尾元素的下一个位置。一般情况下,两个指针的初值设为0,这时队列为空,没有元素。数组定义Q[1…10]。Q(i) i=3,4,5,6,7,8。头指针head=2,尾指针tail=8。队列中拥有的元素个数为:L=tail-head。现要让排头的元素出队,则需将头指针加1。即head=head+1这时头指针向上移动一个位置,指向Q(3),表示Q(3)已出队。如果想让一个新元素入队,则需尾指针向上移动一个位置。即tail=tail+1这时Q(9)入队。当队尾已经处理在最上面时,即tail=10,如果还要执行入队操作,则要发生上溢,但实际上队列中还有三个空位置,所以这种溢出称为假溢出。克服假溢出的方法有两种。一种是将队列中的所有元素均向低地址区移动,显然这种方法是很浪费时间的;另一种方法是将数组存储区看成是一个首尾相接的环形区域。当存放到n地址后,下一个地址就翻转为1。在结构上采用这种技巧来存储的队列称为循环队列。队列和栈一样只允许在断点处插入和删除元素。循环队的入队算法如下:1、tail=tail+1;2、若tail=n+1,则tail=1;3、若head=tail,即尾指针与头指针重合了,表示元素已装满队列,则作上溢出错处理;4、否则,Q(tail)=X,结束(X为新入出元素)。队列和栈一样,有着非常广泛的应用。注意:(1)有时候队列中还会设置表头结点,就是在队头的前面还有一个结点,这个结点的数据域为空,但是指针域指向队头元素。(2)另外,上面的计算还可以利用下面给出的公式cq.rear=(cq.front+1)/max;当有表头结点时,公式变为cq.rear=(cq.front+1)/(max+1)。
[create_time]2016-05-27 02:40:11[/create_time]2016-06-08 00:24:04[finished_time]1[reply_count]0[alue_good]牛牛最美俷[uname]https://himg.bdimg.com/sys/portrait/item/wise.1.a91ae15d.6oeL7CluDvEt0RjbMxHbag.jpg?time=3640&tieba_portrait_time=3640[avatar]TA获得超过128个赞[slogan]这个人很懒,什么都没留下![intro]523[view_count]求教多线程接收消息队列的问题
消息线程与线程?Windows编程里并没有这种划分。
线程有两种,分别叫用户界面线程和工作者线程,很多人误以为这两个种类是在线程最初建立时为其赋予的天生的属性,实际上它们的区别不在于建立时,而在于运行时是否创建了消息队列,任何线程在最初建立时是一样的。
无论是系统在启动窗口程序时为其建立一个主线程,还是程序员在主线程运行时调用CreateThread建立一个新线程,内部过程以及为线程建立的内部数据结构是一样的,都是调用Ntdll.dll的RtlUserThreadStart函数并传入线程入口指令地址和一个线程参数(系统启动主线程时传入的线程参数为0)。这时它们都没有自己的线程消息队列,都是工作者线程。但是窗口程序的主线程往往在启动后很快建立一个窗口并循环调用GetMessage抓取消息,而一旦线程调用一个与图形用户界面有关的函数,如GetMessage/PeekMessage检查消息队列或建立一个窗口,系统就会为该线程分配一些与用户界面相关的资源,尤其是分配一个用于管理消息队列的THREADINFO结构,这时线程的消息队列就建立起来,主线程也就转变为用户界面线程。
所以即使MFC程序员是调用AfxBeginThread(ThreadProc,Param)方式建立了一个工作者线程,但是他依然可以在线程函数中通过创建一个窗口或调用GetMessage/PeekMessage函数为线程建立消息队列,使其转变为用户界面线程。
MFC直接建立用户界面线程的方法是:
首先从CWinThread类派生一个新的线程类,就叫它CMultipleThread吧,这个类下需要有窗体成员CMultipleThreadDlg* m_pDlg用于在窗体上显示,要不然怎么叫界面进程呢?还需要重载虚函数virtual int Run(),在Run函数里进行需要的操作。
接着就可以在程序创建该线程
CMultipleThread* pThread = (CMultipleThread*)AfxBeginThread(RUNTIME_CLASS(CMultipleThread),THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL),
pThread->SetOwner(this)//设置窗口指针
pThread->ResumeThread();//恢复线程
[create_time]2016-12-12 20:17:27[/create_time]2016-12-27 20:14:47[finished_time]1[reply_count]0[alue_good]su...6@sina.com[uname]https://himg.bdimg.com/sys/portrait/item/wise.1.6a8c869e.IkWS7gFEGS8LLZVtXdy4_w.jpg?time=7004&tieba_portrait_time=7004[avatar]TA获得超过144个赞[slogan]这个人很懒,什么都没留下![intro]65[view_count]
java中的queue类有哪些用法?
java中的queue类是队列数据结构管理类。在它里边的元素可以按照添加它们的相同顺序被移除。
队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。不过优先级队列和 LIFO 队列(或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按 LIFO(后进先出)的方式对元素进行排序。无论使用哪种排序方式,队列的头都是调用remove()或poll()所移除的元素。在 FIFO 队列中,所有的新元素都插入队列的末尾。其他种类的队列可能使用不同的元素放置规则。每个Queue实现必须指定其顺序属性。
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素 如果队列为空,则阻塞
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个
NoSuchElementException异常
注意:poll和peek方法出错进返回null。因此,向队列中插入null值是不合法的。
还有带超时的offer和poll方法重载,例如,下面的调用:
boolean success = q.offer(x,100,TimeUnit.MILLISECONDS);
尝试在100毫秒内向队列尾部插入一个元素。如果成功,立即返回true;否则,当到达超时进,返回false。同样地,调用:
Object head = q.poll(100, TimeUnit.MILLISECONDS);
如果在100毫秒内成功地移除了队列头元素,则立即返回头元素;否则在到达超时时,返回null。
阻塞操作有put和take。put方法在队列满时阻塞,take方法在队列空时阻塞。
Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接 口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。BlockingQueue 继承了Queue接口。
[create_time]2022-07-04 03:31:11[/create_time]2022-07-19 03:31:10[finished_time]1[reply_count]0[alue_good]金刚钻Johnny[uname]https://himg.bdimg.com/sys/portrait/item/wise.1.3520b611.14yh9hF5STYZMEJMBUtzOg.jpg?time=3092&tieba_portrait_time=3092[avatar]TA获得超过355个赞[slogan]这个人很懒,什么都没留下![intro]41[view_count]
java中的“queue类”是什么,有什么作用?
java中的queue类是队列数据结构管理类。在它里边的元素可以按照添加它们的相同顺序被移除。\x0d\x0a队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。不过优先级队列和 LIFO 队列(或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按 LIFO(后进先出)的方式对元素进行排序。无论使用哪种排序方式,队列的头都是调用remove()或poll()所移除的元素。在 FIFO 队列中,所有的新元素都插入队列的末尾。其他种类的队列可能使用不同的元素放置规则。每个Queue实现必须指定其顺序属性。\x0d\x0a \x0d\x0aoffer 添加一个元素并返回true 如果队列已满,则返回false\x0d\x0apoll 移除并返问队列头部的元素 如果队列为空,则返回null\x0d\x0apeek 返回队列头部的元素 如果队列为空,则返回null\x0d\x0aput 添加一个元素 如果队列满,则阻塞\x0d\x0atake 移除并返回队列头部的元素 如果队列为空,则阻塞\x0d\x0aelement 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常\x0d\x0a\x0d\x0aadd 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常\x0d\x0aremove 移除并返回队列头部的元素 如果队列为空,则抛出一个\x0d\x0aNoSuchElementException异常\x0d\x0a\x0d\x0a注意:poll和peek方法出错进返回null。因此,向队列中插入null值是不合法的。\x0d\x0a \x0d\x0a还有带超时的offer和poll方法重载,例如,下面的调用:\x0d\x0aboolean success = q.offer(x,100,TimeUnit.MILLISECONDS);\x0d\x0a尝试在100毫秒内向队列尾部插入一个元素。如果成功,立即返回true;否则,当到达超时进,返回false。同样地,调用:\x0d\x0aObject head = q.poll(100, TimeUnit.MILLISECONDS);\x0d\x0a如果在100毫秒内成功地移除了队列头元素,则立即返回头元素;否则在到达超时时,返回null。\x0d\x0a阻塞操作有put和take。put方法在队列满时阻塞,take方法在队列空时阻塞。\x0d\x0a \x0d\x0aQueue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接 口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。BlockingQueue 继承了Queue接口。
[create_time]2022-12-11 20:57:58[/create_time]2022-12-26 20:57:58[finished_time]1[reply_count]0[alue_good]惠企百科[uname]https://pic.rmb.bdstatic.com/bjh/user/343825d09bee196abf9cec8955c23e80.jpeg[avatar]百度认证:北京惠企网络技术有限公司官方账号[slogan]这个人很懒,什么都没留下![intro]16[view_count]
栈和队列的主要区别是什么?
一、规则不同1. 队列:先进先出(First In First Out)FIFO2. 栈:先进后出(First In Last Out )FILO二、对插入和删除操作的限定不同1. 队列:只能在表的一端进行插入,并在表的另一端进行删除;2. 栈:只能在表的一端插入和删除。三、遍历数据速度不同1. 队列:基于地址指针进行遍历,而且可以从头部或者尾部进行遍历,但不能同时遍历,无需开辟空间,因为在遍历的过程中不影响数据结构,所以遍历速度要快;2. 栈:只能从顶部取数据,也就是说最先进入栈底的,需要遍历整个栈才能取出来,而且在遍历数据的同时需要为数据开辟临时空间,保持数据在遍历前的一致性。扩展资料1、进栈(PUSH)算法①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);②置TOP=TOP+1(栈指针加1,指向进栈地址);③S(TOP)=X,结束(X为新进栈的元素);2、退栈(POP)算法①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);②X=S(TOP),(退栈后的元素赋给X):③TOP=TOP-1,结束(栈指针减1,指向栈顶)。
[create_time]2021-04-19 06:46:49[/create_time]2021-04-24 00:00:00[finished_time]3[reply_count]4[alue_good]我爱学习112[uname]https://gips0.baidu.com/it/u=164761072,572425246&fm=3012&app=3012&autime=1660578685&size=b200,200[avatar]每个回答都超有意思的[slogan]这个人很懒,什么都没留下![intro]14880[view_count]栈与队列有什么区别和联系?
栈和队列是两种基本的数据结构,它们都是线性结构,但在数据的存储和访问方式上有一些不同。
栈(Stack)是一种后进先出(Last-In-First-Out,LIFO)的数据结构,就像一叠盘子,只能从最上面取盘子,而在往里放盘子时也只能放在最上面。栈的特点是只能在栈顶进行插入和删除操作,不能在中间或底部进行操作。
队列(Queue)是一种先进先出(First-In-First-Out,FIFO)的数据结构,就像排队买票一样,先到的先买票,后到的只能排在后面等待。队列的特点是只能在队尾进行插入操作,在队头进行删除操作,不能在中间或队列尾进行操作。
虽然栈和队列在实现细节上有所不同,但它们的基本原理是相似的。它们都是将元素按照一定顺序存储,并且支持在特定位置进行插入和删除操作,只是插入和删除的顺序不同。在某些情况下,栈和队列可以相互转化,例如使用两个栈模拟一个队列,或使用两个队列模拟一个栈。
[create_time]2023-04-24 08:58:55[/create_time]2022-09-18 04:24:20[finished_time]2[reply_count]1[alue_good]悲枪奏鸣曲摩羯[uname]https://himg.bdimg.com/sys/portrait/item/wise.1.eadc0919.12ROiRNCcJ0Sexx9Aube5g.jpg?time=4147&tieba_portrait_time=4147[avatar]超过16用户采纳过TA的回答[slogan]一日三餐[intro]1148[view_count]
java中的队列都有哪些,有什么区别
阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列.
从5.0开始,JDK在java.util.concurrent包里提供了阻塞队列的官方实现。尽管JDK中已经包含了阻塞队列的官方实现,但是熟悉其背后的原理还是很有帮助的。一下是阻塞队列的实现:
public class BlockingQueue {
private List queue = new LinkedList();
private int limit = 10;
public BlockingQueue(int limit){
this.limit = limit;
}
public synchronized void enqueue(Object item)
throws InterruptedException {
while(this.queue.size() == this.limit) {
wait();
}
if(this.queue.size() == 0) {
notifyAll();
}
this.queue.add(item);
}
public synchronized Object dequeue()
throws InterruptedException{
while(this.queue.size() == 0){
wait();
}
if(this.queue.size() == this.limit){
notifyAll();
}
return this.queue.remove(0);
}
}
[create_time]2016-07-07 21:00:40[/create_time]2016-07-07 23:45:47[finished_time]2[reply_count]7[alue_good]千锋教育[uname]https://iknow-pic.cdn.bcebos.com/7af40ad162d9f2d3fa896120a0ec8a136227cc61?x-bce-process=image/resize,m_lfit,w_900,h_1200,limit_1/quality,q_85[avatar]做真实的自己 用良心做教育[slogan]千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。[intro]8461[view_count]
java 中 阻塞队列 非阻塞队列 和普通队列的区别是什么?
阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列.从5.0开始,JDK在java.util.concurrent包里提供了阻塞队列的官方实现。尽管JDK中已经包含了阻塞队列的官方实现,但是熟悉其背后的原理还是很有帮助的。一下是阻塞队列的实现:public class BlockingQueue {private List queue = new LinkedList();private int limit = 10;public BlockingQueue(int limit){this.limit = limit;}public synchronized void enqueue(Object item)throws InterruptedException {while(this.queue.size() == this.limit) {wait();}if(this.queue.size() == 0) {notifyAll();}this.queue.add(item);}public synchronized Object dequeue()throws InterruptedException{while(this.queue.size() == 0){wait();}if(this.queue.size() == this.limit){notifyAll();}return this.queue.remove(0);}}
[create_time]2017-09-28 11:56:43[/create_time]2014-04-04 19:18:50[finished_time]2[reply_count]21[alue_good]miniapp16e43ddfde28[uname]https://himg.bdimg.com/sys/portrait/item/wise.1.d16f6804.Rpk3eI6V2YQFWKFMXvxsBw.jpg?time=2813&tieba_portrait_time=2813[avatar]TA获得超过639个赞[slogan]这个人很懒,什么都没留下![intro]14557[view_count]
java 阻塞队列和非阻塞队列的区别 知乎
阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列.从5.0开始,JDK在java.util.concurrent包里提供了阻塞队列的官方实现。尽管JDK中已经包含了阻塞队列的官方实现,但是熟悉其背后的原理还是很有帮助的。一下是阻塞队列的实现:public class BlockingQueue { private List queue = new LinkedList(); private int limit = 10; public BlockingQueue(int limit){ this.limit = limit; } public synchronized void enqueue(Object item) throws InterruptedException { while(this.queue.size() == this.limit) { wait(); } if(this.queue.size() == 0) { notifyAll(); } this.queue.add(item); } public synchronized Object dequeue() throws InterruptedException{ while(this.queue.size() == 0){ wait(); } if(this.queue.size() == this.limit){ notifyAll(); } return this.queue.remove(0); } }
[create_time]2017-11-19 20:27:29[/create_time]2017-11-19 23:45:16[finished_time]1[reply_count]0[alue_good]Mexico卡卡[uname]https://himg.bdimg.com/sys/portrait/item/wise.1.129e6a26.KLsrzH4NXgGcGa6p_aXEQg.jpg?time=4985&tieba_portrait_time=4985[avatar]TA获得超过1万个赞[slogan]这个人很懒,什么都没留下![intro]356[view_count]