Я пробовал использовать Stacks с ArrayList и получил ошибку: Метод push(int), pop(int) не определен для типа StackClass.Stack [закрыто]

Вопрос или проблема

Я пробовал использовать 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();
        }
    }
}

Объяснение изменений:

  1. Статические методы: Убраны модификаторы static из методов push, pop, peek, и isEmpty, так как они должны работать с экземплярами класса Stack.

  2. Использование экземпляра: В методе main создается экземпляр класса StackClass, после чего создается экземпляр внутреннего класса Stack, используя sc.new Stack().

  3. Доступ к списку: Поле list сделано приватным (private), чтобы предотвратить доступ к нему извне класса, что увеличивает инкапсуляцию.

Теперь код должен работать без ошибок, и вы сможете выполнять операции стека, такие как push, pop и peek, как и предполагалось.

Оцените материал
Добавить комментарий

Капча загружается...