堆栈有索引吗?

时间:2013-06-06 01:58:17

标签: stack

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

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

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

6 个答案:

答案 0 :(得分: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;
}

是的,这非常非常慢。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

“Stack”是一个抽象的概念,而不是现实中存在的东西。在现实世界中,它们通常作为连续内存地址中的数据实现,因此根据您使用的语言/库/ API,索引它们当然是可能的。没有特定的语言或库,就没有办法回答像你这样的问题。

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

答案 3 :(得分:1)

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

但这个想法很荒谬。

答案 4 :(得分:0)

查看反向波兰表示法,了解如何使用堆栈进行计算。

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

基本上按下值,然后弹出它们并应用一个函数。

答案 5 :(得分:0)

堆栈有索引。根据您实现堆栈的方式,我们可以使用数组或链表在数组中实现堆栈,索引从零开始从左到右。但是我们可以从

以两种方式进行索引
  1. 将顶部元素堆叠到最底部元素
  2. 最底层元素到最顶层元素