1

是的,所以我的一个朋友说我们可以使用索引来遍历堆栈,但我认为他错了。基本上,我有一个作业,我必须使用数组编写算法。我不得不使用两个 for 循环来做到这一点,所以我想知道如何用堆栈做这样的事情:

for(int i = 0; i < n; i++)
{
    for(int j = 0; j < n; j++)
    {
        x = A[i]+A[j]
    }
}

有没有办法对?而且我必须使用 pop() 和 push() 来做我需要做的事情,对吧?因为我同时使用了数组和堆栈,但我的一个朋友告诉我我不能这样做。我知道我们可以使用数组来实现堆栈,但是堆栈 ADT 没有索引(尽管他们只是说堆栈而不是堆栈 ADT)。

4

6 回答 6

4

说我们可以使用索引来遍历堆栈,但我认为他错了。

你是对的,他是错的。

没有办法[做两个嵌套循环]对吗?

如果您有足够的空间用于临时堆栈,则可以访问元素index:弹出到索引,同时将弹出的值存储到临时堆栈中,记住该值,然后将值推回:

int GetAt(Stack s, int index) {
    Stack temp;
    while (temp.size() != index) {
        temp.push(s.pop());
    }
    int res = temp.top();
    while (!temp.empty()) {
        s.push(temp.pop());
    }
    return res;
}

是的,这非常非常慢。

于 2013-06-06T02:04:18.887 回答
2

是的,纯堆栈抽象不会有索引。但是纯粹的抽象很少存在于 Comp Sci 教室和 Haskell 用户组之外,并且大多数堆栈实现都可以承认这样的事情,因为实际上,它们通常使用数组来实现。归根结底,你不会因为某件事有多“纯粹”而获奖,而是因为你完成了工作。我当然可以想象这样一种情况,您构建了一个堆栈,然后在某个时候,您需要处理循环中给定的所有元素。欢迎来到真实的世界!

于 2013-06-06T02:01:59.007 回答
1

其实你们都错了(tm)!使用两个堆栈(“纯”堆栈),您可以低效地实现一个数组。假设堆栈 S1 有 10 个项目压入其中,而您想要项目 5;只需从 S1 中弹出 4 个项目,依次将每个项目推到 S2。然后再弹出一个,那就是你的项目。只需跟踪当前正在使用的项目的索引(在两个堆栈上),您就可以在需要时随时检索任何其他项目。

但这种想法是荒谬的。

于 2013-06-06T03:54:50.987 回答
1

“栈”是一个抽象的概念,并不是现实中存在的东西。在现实世界中,它们通常被实现为连续内存地址中的数据,因此对它们进行索引当然是可能的,具体取决于您使用的语言/库/API。如果没有特定的语言或库,真的无法回答像您这样的问题。

如果你真正的意思是,有没有办法用两个只能通过推送/弹出访问的数据集合来进行你提到的计算,那么可能没有中间数组。但你为什么想要?就其本质而言,堆栈旨在用于只需要以 LIFO 方式访问其数据的算法。为什么还要使用一个?

于 2013-06-06T02:19:13.680 回答
0

查看 Reverse Polish Notation 了解如何使用堆栈进行计算。

http://en.wikipedia.org/wiki/Reverse_Polish_notation

基本上推送这些值,然后将它们弹出并应用一个函数。

于 2013-06-06T03:33:28.247 回答
0

堆栈有索引。根据您实现堆栈的方式,我们可以使用数组或链接列表来实现数组中的堆栈,索引从零开始从左到右。但是我们可以通过两种方式进行索引

  1. 将顶部元素堆叠到最底部元素
  2. 最底部元素到最顶部元素
于 2021-01-21T17:14:42.260 回答