Фангенто Asked:2024-09-09 12:19:56 +0000 UTC2024-09-09 12:19:56 +0000 UTC 2024-09-09 12:19:56 +0000 UTC C#。为什么我们需要栈和队列? 772 我不明白为什么需要这个。您能否给出一个简单的示例,说明它们在什么情况下使用(一小段代码和它们可以在什么情况下使用的描述(例如:“如果您需要找到某些东西......可能会很有用”))? c# 1 个回答 Voted Best Answer CrazyElf 2024-09-09T14:20:33Z2024-09-09T14:20:33Z 即兴的,这是两个班级的一个典型问题。 堆栈:在现实生活中,堆栈对我来说没什么用,但可能有一些特定的任务。例如,在面试期间,他们有时会要求一项任务来检查表达式中括号的平衡。这个问题最好使用堆栈来解决 - 您将下一个左大括号放在堆栈上,当右大括号到达时,您检查堆栈上的内容,左大括号是否匹配。 队列:在现实生活中,经常需要队列。例如,您有某种任务,它被划分为子任务(相同类型),并且任务的数量事先是未知的;例如,您需要下载一个站点(或站点列表),您正在解析一个页面,该页面有指向其他页面的链接等。通过每次这样的解析,您都会补充队列 - 将下一个任务添加到其中,以下载您找到链接的页面。并且处理完任务(页面解析)后,从队列中取出下一个需要处理的任务(本例中是需要下载的链接),等等。原则上,可以在没有队列的情况下完成此操作 - 只需Task.Run下载页面即可,然后它们自己Task就会排队。但是您自己的队列很有用,因为服务器有时可能不可用,或者在提供特定页面时可能会出现临时问题。如果您有一个等待下载的任务队列,则可以推迟下载此类有问题的页面和网站,直到稍后,并在处理完其他任务后再次返回处理它们。如果您通过处理任务,Task.Run您最终可能会得到很多任务Task,这些任务将挂在内存中并等待链接变得可用。这比简单地将链接集合存储在队列中需要更多的系统资源。 是的,如果需要,这两个类都是通过其他类实现的:通过列表和通过环形缓冲区(数组)。但专业课程总是更好。那里已经进行了优化,并且已经实施了对使用集合的正确性的检查。如果你自己进行筹码和回合,你可能会忘记一些事情。使用专门用于某些类型任务的现成类会更方便。
即兴的,这是两个班级的一个典型问题。
堆栈:在现实生活中,堆栈对我来说没什么用,但可能有一些特定的任务。例如,在面试期间,他们有时会要求一项任务来检查表达式中括号的平衡。这个问题最好使用堆栈来解决 - 您将下一个左大括号放在堆栈上,当右大括号到达时,您检查堆栈上的内容,左大括号是否匹配。
队列:在现实生活中,经常需要队列。例如,您有某种任务,它被划分为子任务(相同类型),并且任务的数量事先是未知的;例如,您需要下载一个站点(或站点列表),您正在解析一个页面,该页面有指向其他页面的链接等。通过每次这样的解析,您都会补充队列 - 将下一个任务添加到其中,以下载您找到链接的页面。并且处理完任务(页面解析)后,从队列中取出下一个需要处理的任务(本例中是需要下载的链接),等等。原则上,可以在没有队列的情况下完成此操作 - 只需
Task.Run下载页面即可,然后它们自己Task就会排队。但是您自己的队列很有用,因为服务器有时可能不可用,或者在提供特定页面时可能会出现临时问题。如果您有一个等待下载的任务队列,则可以推迟下载此类有问题的页面和网站,直到稍后,并在处理完其他任务后再次返回处理它们。如果您通过处理任务,Task.Run您最终可能会得到很多任务Task,这些任务将挂在内存中并等待链接变得可用。这比简单地将链接集合存储在队列中需要更多的系统资源。是的,如果需要,这两个类都是通过其他类实现的:通过列表和通过环形缓冲区(数组)。但专业课程总是更好。那里已经进行了优化,并且已经实施了对使用集合的正确性的检查。如果你自己进行筹码和回合,你可能会忘记一些事情。使用专门用于某些类型任务的现成类会更方便。