我最近在数据结构方面上了一课,所教的第一件事就是如何在数组中实现堆栈。我可以理解堆栈实现是如何完成的,但我不明白为什么要完成它。我的意思是与堆栈相比,数组更有用,更实用,更灵活。与导致需要从数组中构建堆栈的数组相比,我无法实现堆栈的任何优势。你能帮我清楚一下我对这些概念的看法吗?
答案 0 :(得分:1)
如果我们想要理解为什么存在编程抽象,答案并不在于解释其实现细节(正如Johns在他们的答案中所尝试的那样)。 你需要寻找真实世界的类比,之后我们已经模拟了一些东西。有这么多。堆栈在我们身边。
您正在谈论堆栈超过阵列的优势。它的优点是,当您的业务逻辑模拟一个堆栈的现实世界问题时,它适合用途。
答案 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;
}
}