Структура стека выполнения данных в Java


Недавно я сделал структуры данных, реализация стека на Java и я хотел бы обратную связь на мой код, чтобы улучшить его (кроме комментирование/документирование кода).

public class Stack {

    private int topIndex, maxSize;
    private int[] stack;

    public Stack(int size) {
        maxSize = size;
        stack = new int[maxSize];
        topIndex = -1;
    }

    public int maxSize() {
        return maxSize;
    }

    public int size() {
        return topIndex + 1;
    }

    public boolean isEmpty() {
        return topIndex == -1;
    }

    public boolean isFull() {
        return (topIndex + 1) == maxSize;
    }

    public void push(int value) {
        if (!isFull()) {
            topIndex++;
            stack[topIndex] = value;
        }
    }

    public int peek() {
        if (!isEmpty()) {
            return stack[topIndex];

        } else {
            return 0;
        }
    }

    public void pop() {
        if (!isEmpty()) {
            topIndex--;
        } 
    }

    public static void main(String[] args) {

    }

}


502
4
задан 5 марта 2018 в 09:03 Источник Поделиться
Комментарии
3 ответа

Я хотел бы дать некоторые мысли, которые приходят на ум, когда я прочитал ваш приведенный код. Теперь, у вас есть конкретные реализации для примитивных ИНЦ. Более продвинутым шагом будет, разумеется, чтобы реализовать универсальный Stack как в JDK, просто упоминания о нем.

Во-первых, мне нравится, что вы используете четкий имена переменных, и что вы повторно использовать такие методы, как isEmtpy \ isFull. Спасибо за это! Кроме того, вам не нужно maxSize переменная, так как он такой же, как stack.length.

Это фиксированный размер стека, так это значит, что вы должны знать заранее, сколько элементов было бы взяться, чтобы не тратить пространство (или бегут из нее). Возможно, для последующих упражнений, которые вы могли бы попробовать и сделать его динамически изменяемого размера?

Теперь, для push метод. Я не позволю, чтобы это молча преуспеть, если стек уже заполнен. Видя, как это фиксированный размер стека, я бы, вероятно, решили бросить Exceptionпотому что для меня это выглядит как ошибка программирования. Вторую идею можно было бы вернуть boolean, сигнализация успех или неудача (хотя я не думаю, что это лучшее решение).

Же с Peek. Он теперь молча завершается успешно и возвращает 0, который очень хорошо допустимое значение, которое может находиться в стеке (EmptyStackException существует, кстати!). В boolean решение не будет работать, конечно. Кроме того, я лично не думаю, что дополнительной новой линии является улучшением, наоборот.

Наконец, мне pop значит, снимая верхний элемент стека. Так почему бы не вернуть его?

6
ответ дан 5 марта 2018 в 10:03 Источник Поделиться

Большинство пунктов уже были покрыты Koekje. Однако я не думаю, что объявив более чем одной переменной в каждой строке-это хорошая идея. Это легко поняли, если вам случится быть низкая на кофе.
Рассмотрим для примера int i, j = 1; Что может привести некоторых людей к mistakingly считаю, что обе переменные инициализируются.
Вы также потеряете возможность комментировать отдельные переменные, если это необходимо.
Дальнейшее чтение [1][2]

Я также не согласен с вашим решением, чтобы добавить дополнительное вертикальное пространство в вашем режиме функции. Как правило, вертикальное пространство предполагает перерыв в потоке/логика. Однако в вашем примере, если заявление одной логической единице и должны рассматриваться как таковые.

5
ответ дан 5 марта 2018 в 11:03 Источник Поделиться

В целом хорошо выглядящий код.
Вот некоторые из моих отзывов:

private int[] stack; использование генериков.

public Stack(int size) убедитесь, что размер больше, чем 0.

stack = new int[maxSize]; разумный способ будет динамично расширяться и сжиматься.

public int maxSize() { лучше бы звали 'getMaxSize()'

if (!isFull()) { вы можете хотеть бросать исключение или возвращать false, если вы не добавить в стек. В противном случае вы можете вернуть true.

return 0; 0 может быть допустимое значение в стек. снова использовать логические/исключение для таких случаев.

public void pop() { поп-способ никогда не должны быть аннулированы.

1
ответ дан 6 марта 2018 в 02:03 Источник Поделиться