Вопрос или проблема
Я пробовал использовать Stacks с ArrayList и получил ошибку: Метод push(int), pop(int) не определен для типа StackClass.Stack [закрыто]
В моем коде я пытался выполнить операции со стеком, такие как push, pop и peek, используя методы на Java с ArrayList. Я реализовал код с логикой стека, которая имеет сложность O(1), но когда я запускаю свой код, я получаю ошибку, что методы pop, push и peek не определены в классе стека. Если кто-то мог бы помочь мне понять, где я ошибся, это было бы большим подспорьем. Спасибо.
Мой код :
import java.util.*;
public class StackClass {
class Stack{
ArrayList<Integer> list = new ArrayList<>();
public static boolean isEmpty(){
return list.size() == 0;
}
}
//push
public static void push(int data){
list.add(data);
}
//pop
public static int pop(){
if(isEmpty()){
return -1;
}
int top = list.get(list.size() - 1);
list.remove(list.size() - 1);
return top;
}
//peek
public static int peek(){
if(isEmpty()){
return -1;
}
return list.get(list.size() - 1);
}
public static void main(String[] args) {
Stack s = new Stack();
s.push(1);
s.push(2);
s.push(3);
s.push(4);
while(!s.isEmpty()){
System.out.println(s.peek());
s.pop();
}
}
}
Я получаю такую ошибку:
Метод push(int) не определен для типа StackClass.Stack
Метод push(int) не определен для типа StackClass.Stack
Метод push(int) не определен для типа StackClass.Stack
Метод push(int) не определен для типа StackClass.Stack
Метод peek() не определен для типа StackClass.Stack
Метод pop() не определен для типа StackClass.Stack
Ответ или решение
Проблема, с которой вы столкнулись, связана с тем, что методы push
, pop
и peek
определены как статические (static
) в классе StackClass
, в то время как вы пытаетесь их использовать на экземпляре класса Stack
. Метод статический принадлежит самому классу, а не его экземплярам. Поэтому вам нужно изменить реализацию вашего класса стека.
Вот исправленный вариант вашего кода:
import java.util.ArrayList;
public class StackClass {
// Внутренний класс для реализации стека
class Stack {
private ArrayList<Integer> list = new ArrayList<>();
// Проверка, пустой ли стек
public boolean isEmpty() {
return list.size() == 0;
}
// Добавление элемента в стек
public void push(int data) {
list.add(data);
}
// Удаление элемента из стека
public int pop() {
if (isEmpty()) {
return -1; // Возвращаем -1, если стек пустой
}
int top = list.get(list.size() - 1);
list.remove(list.size() - 1);
return top;
}
// Получение верхнего элемента стека без его удаления
public int peek() {
if (isEmpty()) {
return -1; // Возвращаем -1, если стек пустой
}
return list.get(list.size() - 1);
}
}
public static void main(String[] args) {
StackClass sc = new StackClass(); // Создаем экземпляр класса StackClass
Stack s = sc.new Stack(); // Создаем экземпляр внутреннего класса Stack
s.push(1);
s.push(2);
s.push(3);
s.push(4);
while (!s.isEmpty()) {
System.out.println(s.peek());
s.pop();
}
}
}
Объяснение изменений:
-
Статические методы: Убраны модификаторы
static
из методовpush
,pop
,peek
, иisEmpty
, так как они должны работать с экземплярами классаStack
. -
Использование экземпляра: В методе
main
создается экземпляр классаStackClass
, после чего создается экземпляр внутреннего классаStack
, используяsc.new Stack()
. - Доступ к списку: Поле
list
сделано приватным (private), чтобы предотвратить доступ к нему извне класса, что увеличивает инкапсуляцию.
Теперь код должен работать без ошибок, и вы сможете выполнять операции стека, такие как push
, pop
и peek
, как и предполагалось.