如何实现一个等待元素弹出的堆栈

     2023-02-21     302

关键词:

【中文标题】如何实现一个等待元素弹出的堆栈【英文标题】:How to implement a stack that waits until element comes to make pop 【发布时间】:2016-09-05 15:21:03 【问题描述】:

我的问题与我将要描述的不同,但本质是类比。

让我们考虑一个stack。堆栈具有方法pop()。此方法从顶部移除元素并返回它。

问题

当栈中没有元素时,不要抛出异常。而是等到一个元素可以被弹出(即当一个新元素被推送时)。

我为此集思广益几个小时,以下是我想到的一些想法:

TPL 数据流 反应式扩展 SpinWait.SpinUntil()

我不确定这些是否是解决问题的好方法,但它闻起来像可观察

如何处理?

目标:在Parallel.ForEach 内消耗弹出。当资源可用时,应尽快归还。

【问题讨论】:

BlockingCollection 在 System.Collections.Concurrent;听起来像你想要的。它有一个GetConsumingEnumerable(),当与 foreach 循环一起使用时,它会在元素存在时获取元素,并在为空时等待。这些也是线程安全的。 【参考方案1】:

我认为您需要一个带有命令的队列(例如pop())。

当堆栈中没有元素时,pop() 命令不会执行,而是留在队列中。

一旦将某些内容插入堆栈,命令解释器将检查它是否可以执行命令(在您的情况下为pop())然后执行它。

如果stack 发生更改,您可以使用async 模式通知您,解释器将据此执行命令。这样您就可以避免轮询以检查堆栈状态是否已更改。

Observable Collection 似乎也是一个不错的选择。

【讨论】:

如何在汇编中使用堆栈对数组进行排序

】如何在汇编中使用堆栈对数组进行排序【英文标题】:Howtosortanarrayusingstackinassembly【发布时间】:2021-08-2001:55:54【问题描述】:我想在使用堆栈时对数组进行排序:所以首先我将它全部推入堆栈。然后我在堆栈中找到最小元素... 查看详情

C++ 函数调用与堆栈上推送/弹出的新块

...:06:53【问题描述】:我在阅读C++中的变量作用域时遇到了一个有趣的块结构:intmain(intargc,char**argv)intlocal;//Newlevelofscopeintmore_local;return0;我知道变量会在 查看详情

XCUITest 等待可能出现的元素

...遇到了一种情况,我试图消除“可能”出现的警报。这是一个在用户第一次进入照片编辑器时弹出的教程,但它只在第一次启动时弹出。由于我们不想在每次测试之间重置模拟器(出于速度原因),因此此警报“可能”或“可能... 查看详情

堆栈二链表实现堆栈(代码片段)

用链表来实现堆栈的优点是随时可以动态改变链表的长度,能够有效利用内存资源,缺点就是设计的算法比较复杂classNode:#堆栈链结节点的声明def__init__(self):self.data=0#堆栈数据的声明self.next=None#堆栈中用来指向下一个节点top=None... 查看详情

使用高效的 `has` 操作实现堆栈

...堆栈包含参数,has操作应该返回true。我需要has操作快,如何实现?例子:推送(1)、推送(2)、推送(1)、弹出()。//期 查看详情

如何隐藏弹出的 UISearchController

】如何隐藏弹出的UISearchController【英文标题】:HowtohidethepoppedUISearchController【发布时间】:2019-01-1015:26:29【问题描述】:我是swift的初学者。我有一个包含TableView的ViewController。letsearchController=UISearchController(searchResultsController:nil)... 查看详情

javascript实现图片点击弹出

...插件的使用和安装极其繁琐,于是上网查了些demo,自己实现了一个纯js的图片弹出插件。实现的思路是通过编写hook图片的onclick事件的函数,在函数中对body追加div元素,再将传入的图片对象放入元素中,同时再监听div的onclilck事... 查看详情

Java Stack - 如何从堆栈中弹出()和推送()多个元素?

】JavaStack-如何从堆栈中弹出()和推送()多个元素?【英文标题】:JavaStack-HowdoIpop()andpush()multipleelementsfromastack?【发布时间】:2021-12-1404:05:08【问题描述】:我已经有一个堆栈类在工作,但现在我每次只能弹出和推送1个元素... 查看详情

如何检查python列表的最后一个元素?

】如何检查python列表的最后一个元素?【英文标题】:Howtocheckthelastelementofapythonlist?【发布时间】:2011-05-0409:07:15【问题描述】:在python中,我需要一个堆栈,并且我正在为它使用一个list。在文档中,它说您可以使用append()和pop(... 查看详情

如何在不弹出元素且不循环的情况下在 C++ 中打印整个堆栈?

】如何在不弹出元素且不循环的情况下在C++中打印整个堆栈?【英文标题】:HowtoprintwholestackinC++inwithoutpoppingoutelementsandwithoutloop?【发布时间】:2021-11-0622:51:32【问题描述】:在Java中,我们可以像这样打印堆栈Stack<Integer>s=new... 查看详情

如何在纯javascript中显示和隐藏弹出的onclick?

】如何在纯javascript中显示和隐藏弹出的onclick?【英文标题】:Howtoshowandhidepopuponclickinpurejavascript?【发布时间】:2022-01-0600:19:33【问题描述】:我有一个名为“query-pop-up”的弹出类,我想在纯js中显示和隐藏弹出的onclick。如何实... 查看详情

设计一个对中间元素进行操作的堆栈

...onmiddleelement【发布时间】:2013-06-0418:10:11【问题描述】:如何实现一个支持O(1)时间复杂度以下操作的栈?将元素添加到堆栈顶部的推送。从栈顶移除元素的Pop。查找将返回堆栈中间元素的中间元素。DeleteMiddle将删除中间元素【... 查看详情

堆栈的方法实现(代码片段)

1.栈的基本知识栈(stack),是一种线性存储结构,它有以下几个特点:(1)栈中数据是按照"后进先出(LIFO,LastInFirstOut)"方式进出栈的。(2)向栈中添加/删除数据时,只能从栈顶进行操作栈通常操作:push --将一个新值压... 查看详情

栈和队列:用一个栈实现另一个栈的排序

...栈从顶到底按从大到小的顺序排序,只允许申请一个栈。如何完成排序?     将排序的栈记为stack,辅助栈记为help,在stack上执行pop操纵,弹出的元素为tmp1.如果tmp大于或等于help的栈顶元素或help为空,则将tmp压... 查看详情

push指令pop指令

一、push、pop指令的作用:push和pop都是堆栈操作指令。实现压入操作的指令是push指令;实现弹出操作的指令是pop指令。二、push的操作过程是:(sp)<--(sp)-2,((sp))<--oprd即先修改堆栈指针sp(压入时为自动减2),然后,将指定的操作数送... 查看详情

算法:栈和队列

...的基本性质栈是先进后出的队列是先进先出的栈和队列在实现结构上可以有数组和链表两种形式数组结构实现较容易用链表结构较复杂,因为牵扯很多指针操作(二)队列和栈的基本操作pop操作(栈尾弹出一个元素)push操作(... 查看详情

算法题05-用一个栈实现另一个栈的排序(代码片段)

...之外,可以申请新的变量,但不能申请额外的数据结构。如何完成排序?思路将要排序的栈记为stack,申请的辅助栈记为help,在stack上执行pop操作,弹出的元素记为cur.如果cur小于或等于help的栈顶元素,则将help直接压入help如果cur大... 查看详情

从弹出的视图控制器传递数据

...1-07-2719:28:05【问题描述】:我有两个视图控制器。我是第一个,当我按下按钮时,第二个视图控制器被推到导航控制器的堆栈上。在这里,在第二个视图控制器中,我有一个表格视图,当我点击某些行时,它们被选中(如复选框... 查看详情