Ada是否有标准的堆栈实现?

Ada是否有标准的堆栈实现?,ada,Ada,我满怀希望地用Ada.Containers打字。查看自动完成列表,但没有看到堆栈或任何类似的列表。Ada标准库真的没有堆栈实现吗 在我发现的Rosetta代码中,它非常缺乏,因为它为添加的每个节点运行到分配器 我觉得我一定错过了其他一些Ada标准库,因为我不断遇到一些基本的库功能,这些功能显然是缺失的。您可以像在大多数其他编程语言中一样,将Ada.Containers.Vectors.Vector作为堆栈使用 附加E是推送 V.Last_元素是当前的顶部元素 V.Delete_最后一个是pop

我满怀希望地用Ada.Containers打字。查看自动完成列表,但没有看到堆栈或任何类似的列表。Ada标准库真的没有堆栈实现吗

在我发现的Rosetta代码中,它非常缺乏,因为它为添加的每个节点运行到分配器

我觉得我一定错过了其他一些Ada标准库,因为我不断遇到一些基本的库功能,这些功能显然是缺失的。

您可以像在大多数其他编程语言中一样,将Ada.Containers.Vectors.Vector作为堆栈使用

附加E是推送 V.Last_元素是当前的顶部元素 V.Delete_最后一个是pop 通常,堆栈描述数据结构的语义。您可以将此语义指定给不同类型的数据结构,例如动态数组向量是一个或链接的解决方案列表

标准库通过实现定义良好的通用数据结构来提供功能。作为用户,您可以选择符合所需语义的数据结构。

您可以像在大多数其他编程语言中一样,将Ada.Containers.Vectors.Vector用作堆栈

附加E是推送 V.Last_元素是当前的顶部元素 V.Delete_最后一个是pop 通常,堆栈描述数据结构的语义。您可以将此语义指定给不同类型的数据结构,例如动态数组向量是一个或链接的解决方案列表


标准库通过实现定义良好的通用数据结构来提供功能。作为用户,您可以选择一种符合您所需语义的数据结构。

我不相信我在50年的主要实时控制系统编程中实际使用过堆栈。没有标准Ada.Containers.Stacks的部分原因可能是教育者会丢失初学者数据结构课程中的一个介绍性主题:-

国家

[it]为Ada提供了许多有用的容器。只提供最有用的容器。那些相对容易编码、冗余或很少使用的代码将从该集合中省略,即使它们通常包含在容器库中

可以使用向量以传统方式实现堆栈:


这样就有机会创建有界堆栈,并在适当的情况下预先分配无界堆栈,也就是说,您知道典型的最大深度,但偶尔会考虑更深的深度。

我不相信我在50年的主要实时控制系统编程中实际使用过堆栈。没有标准Ada.Containers.Stacks的部分原因可能是教育者会丢失初学者数据结构课程中的一个介绍性主题:-

国家

[it]为Ada提供了许多有用的容器。只提供最有用的容器。那些相对容易编码、冗余或很少使用的代码将从该集合中省略,即使它们通常包含在容器库中

可以使用向量以传统方式实现堆栈:


这样就有机会创建有界堆栈,并在适当的情况下预先分配无界堆栈,即您知道典型的最大深度,但偶尔希望允许更深的堆栈。

请参阅PragmAda可重用组件既有界堆栈,也有无界堆栈。@JeffreyR.Carter您的评论将给出一个很好的答案,这似乎与你选择评论的这个特定答案没有任何关系。但是,我找不到的堆栈实现是静态的,即不能生成两个堆栈。你说得对:只有无限的堆栈。我为我的失实陈述道歉。大多数数据结构都有有有界形式和无界形式,我忘记了很少使用的堆栈缺少有界形式,尽管如果有需要,可以很容易地在有界列表的顶部构建有界形式。至于你的断言,你不能做两个堆栈,那显然是错误的。给定一个堆栈组件的实例堆栈,可以声明S1,S2:Stacks.Handle;PragmAda可重用组件有两个堆栈。PragmAda可重用组件有有界堆栈和无界堆栈。@JeffreyR.Carter您的评论会给出一个很好的答案,它似乎与您选择评论的这个特定答案没有任何关系。但是,我找不到的堆栈实现是静态的,即不能生成两个堆栈。你说得对:只有无限的堆栈。我为我的失实陈述道歉。大多数数据结构都有有有界形式和无界形式,我忘记了很少使用的堆栈缺少有界形式,尽管如果有需要,可以很容易地在有界列表的顶部构建有界形式。至于
你的断言,你不能做两个堆栈,这显然是错误的。给定一个堆栈组件的实例堆栈,可以声明S1,S2:Stacks.Handle;有两个堆栈。@TamaMcGinn,我会回滚编辑,因为为什么不大写堆栈?b在愤怒中使用=>用于真正的任务,参见c我不认为有人会花近50年的时间在Ada中编程。不知道为什么它不让我。哦,对不起!只是刚刚发现了这条评论。我相信这样会给作者发送一个通知,但是如果其他人更早地接受了对编辑的审查,那么即使作者在此期间只有10分钟的时间来审查编辑,审查仍然有效,你当然应该被允许回滚编辑。关于“愤怒中使用”,作为一个以英语为母语的成年人,我很惊讶地学到了一个新短语。但事实如此,我仍然建议避免使用这个短语。我真的认为它是“Ada”的自动完成。@TamaMcGinn,我会回滚编辑,因为为什么不大写堆栈?b在愤怒中使用=>用于真正的任务,参见c我不认为有人会花近50年的时间在Ada中编程。不知道为什么它不让我。哦,对不起!只是刚刚发现了这条评论。我相信这样会给作者发送一个通知,但是如果其他人更早地接受了对编辑的审查,那么即使作者在此期间只有10分钟的时间来审查编辑,审查仍然有效,你当然应该被允许回滚编辑。关于“愤怒中使用”,作为一个以英语为母语的成年人,我很惊讶地学到了一个新短语。但事实如此,我仍然建议避免使用这个短语。我真的认为这是“Ada”的自动完成。
      package Stacks is new Ada.Containers.Vectors (ET);
      use Stacks;

      Stack : Stacks.Vector;

      procedure Push (E : in ET) is
      begin
         Append (Stack, New_Item => E);
      end;

      function Top return ET is
      begin
         return Last_Element (Stack);
      end;

      procedure Pop is
      begin
         Delete_Last (Stack);
      end;