У меня недавно был урок в структуре данных, и первое, чему учили, - это реализовать стек в массиве. Я мог понять, как была выполнена реализация стека, но я не понимаю, почему это делается. Я имею в виду, что массивы более полезны и практичны и гибки по сравнению со стеками. Я не могу сказать ничего о преимуществах стека по сравнению с массивами, которые приводят к необходимости создания стека из массива. Можете ли вы помочь мне понять мои идеи об этой концепции?Реализация стека
ответ
Я думаю, вы путаете основные преимущества стека и массива. Стек может быть реализован через массив, но на самом базовом уровне массив - это инструмент, а стек - это способ, которым вы можете использовать этот инструмент в своих интересах.
Другими словами, массив может использовать для реализации стека, но подумайте о массиве как инструменте для хранения данных. Вы можете использовать массив для реализации кучи, стека или даже очереди - все дело в том, как вы используете массив для выполнения конкретной задачи.
Важно то, что вы узнаете, когда вам нужно использовать стек, кучу, очередь и т. Д., А также то, что «инструменты» (массив, связанный список и т. Д.) Вы имеете в своем распоряжении для реализации таких данных структур.
Концептуально вы используете операции Push и Pop на стеке: вы нажимаете на стек и выталкиваете стек. Стек отслеживает порядок поступления элементов, последний из которых является первым (LIFO). Вы работаете только с элементом в верхней части стека, либо выталкиваете верхний элемент из стека, либо нажимаете на него новый элемент. Если один компонент подталкивает 4 вещи в стек, другой компонент может вытащить их из стека и знает порядок, который использовался компонентом «pushing».
Обычно вы используете массив путем либо итерации через каждый член списка, либо путем доступа к элементу в любом месте массива индексом. Обычно вы используете массив, когда вам действительно не нужен порядок LIFO, вы просто хотите получить доступ к любому элементу для какой-либо другой цели или хотите выполнить операцию над каждым элементом и не заботитесь о порядке LIFO.
Если мы хотим понять, почему существует абстракция программирования, ответ не заключается в объяснении его деталей реализации (как и Джонс в своих ответах). Вам нужно искать аналогии в реальном мире, после чего мы что-то смоделировали. Существует так много. Стеки вокруг нас.
- держатель монет в машине
- пластины Ikea тележки
- 9 мм пистолет
- сложенных товаров в магазинах по всему миру (Thats, вероятно, наиболее распространенным стеком в человеческом мире)
- и т.д. ..
Вы говорите о преимуществе стека над массивом. Его преимущество заключается в том, что это подходит для целей, когда бизнес-логика моделирует проблему реального мира, которая представляет собой стек.
Я могу предоставить вам Java версию того же: /** * */ пакет com.base.stack;
/** * @author kamals1986 * Данные, которые поступают в стек. */ общественного класса Item {
int value;
public Item(int value) {
this.value = value;
}
@Override
public String toString() {
return "Item [value=" + value + "]";
}
}
Фактический класс в настоящее время:
упаковка com.base.stack;
импорт 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;
}
}
- 1. Реализация стека
- 2. Java: реализация стека
- 3. Правильная реализация поведения стека
- 4. реализация ограниченного стека
- 5. Реализация стека в C++
- 6. простая реализация стека
- 7. java.lang.ArrayIndexOutOfBoundsException: 0 (реализация стека)
- 8. Реализация стека с Python
- 9. Реализация стека в Swift
- 10. C реализация стека
- 11. C++ реализация класса стека
- 12. реализация стека значений struts2
- 13. связанная реализация стека
- 14. Реализация стека в C
- 15. Реализация стека в MySQL
- 16. Реализация стека Java-массива
- 17. Вложенная реализация стека
- 18. C++ реализация стека
- 19. Связанные списки реализация стека
- 20. служба Реализация стека ELMAH
- 21. C: Реализация стека
- 22. Реализация стека в программе
- 23. Реализация стека связанных списков - Java
- 24. Реализация класса стека в C++
- 25. Реализация общего стека в C++
- 26. Эффективная реализация стека в Python
- 27. C++ Реализация комбинированной очереди/стека
- 28. Реализация массива стека в C
- 29. Реализация массивов с использованием стека
- 30. Реализация интерпретатора на основе стека
"массив" может иметь несколько значений в программировании. Если вы говорите об определенном языке, можете ли вы прояснить это как минимум? Я предполагаю C или C++? –