堆栈的实现

时间:2015-03-02 23:55:15

标签: stack

我最近在数据结构方面上了一课,所教的第一件事就是如何在数组中实现堆栈。我可以理解堆栈实现是如何完成的,但我不明白为什么要完成它。我的意思是与堆栈相比,数组更有用,更实用,更灵活。与导致需要从数组中构建堆栈的数组相比,我无法实现堆栈的任何优势。你能帮我清楚一下我对这些概念的看法吗?

4 个答案:

答案 0 :(得分:1)

如果我们想要理解为什么存在编程抽象,答案并不在于解释其实现细节(正如Johns在他们的答案中所尝试的那样)。 你需要寻找真实世界的类比,之后我们已经模拟了一些东西。有这么多。堆栈在我们身边。

  • 汽车中的硬币夹
  • ikea手推车中的盘子
  • 9毫米枪
  • 在世界各地的商店中堆放货物(这可能是人类世界中最普遍的堆栈)
  • 等。

您正在谈论堆栈超过阵列的优势。它的优点是,当您的业务逻辑模拟一个堆栈的现实世界问题时,它适合用途。

答案 1 :(得分:0)

我认为你混淆了堆栈和数组的基本优势。堆栈可以通过数组实现,但在最基本的层面上,数组是一个工具,堆栈是一种可以使用该工具的方式。

换句话说,可以使用数组 来实现堆栈,但将数组视为存储数据的工具。您可以使用数组来实现堆,堆栈甚至队列 - 这都是关于如何使用数组来完成特定任务的。

重要的是你能够识别何时需要使用堆栈,堆,队列等,同样,你可以使用什么“工具”(数组,链表等)来实现这样的数据结构。

答案 2 :(得分:0)

从概念上讲,您在堆栈上使用推送和弹出操作:您将推入堆栈并弹出堆栈。堆栈跟踪元素到达的顺序,最后一个是第一个(LIFO)。您只能使用堆栈顶部的元素,将顶部项目弹出堆栈或在其上方推送一个新元素。如果一个组件将4个东西推入堆栈,另一个组件可以将它们从堆栈中弹出,并知道“推送”所使用的顺序。成分

您通常通过遍历列表的每个成员来使用数组,或者通过索引访问数组中任何位置的元素。通常当你真的不关心LIFO订单时你会使用数组,你只是想为了其他目的访问任何项目,或者你想对每个元素执行操作而不关心LIFO订单。

答案 3 :(得分:0)

我可以为你提供相同的java版本: / **  *  * / package com.base.stack;

/ **  * @author kamals1986  *堆栈中的数据。  * / 公共类项目{

int value;

public Item( int value) {
    this.value = value;
}

@Override
public String toString() {
    return "Item [value=" + value + "]";
}

}

  
    
      
        

现在的实际班级:

      
    
  

package com.base.stack;

import java.util.Arrays;

/ **  * @author kamals1986  *  * / 公共课MyStack {

private static int INITIAL_SIZE = 5;
protected Item[] items = new Item[INITIAL_SIZE];
int top = -1;

@Override
public String toString() {
    return "MyStack [items=" + Arrays.toString(items) + "]\n";
}

public void push(Item i) {
    if (top == -1 || stackNotFull()) {
        System.out.println("Not resizing");
        top = top + 1;
        items[top] = i;
    } else {
        System.out.println("Stack is full , I am resizing it by 2 more");
        int newCapacity = items.length + 2;
        top = items.length - 1;
        items = Arrays.copyOf(items, newCapacity);
        top++;
        items[top] = i;
    }
}

public void displayContents() {
    System.out.println(this);

}

public Item pop() {
    if (top == -1) {
        throw new RuntimeException("Stack is empty");
    } else {
        Item i = items[top];
        items[top] = null;
        top--;
        return i;
    }
}

private boolean stackNotFull() {
    return top < items.length - 1;
}

}