Реализация абстрактного типа данных в процедурном программировании - PullRequest
0 голосов
/ 28 декабря 2018

У меня вопрос к более продвинутым разработчикам ООП.Я в настоящее время студент CS.Мы изучили процедурное программирование на Java в первом семестре, где был введен ADT.Я понимаю теорию и идею о том, почему ADT хорош и каковы его преимущества, но мне кажется довольно сложным реализовать его в коде.Я запутался и потерян.В дополнение к этому наш тест выхода был на бумаге (нам пришлось написать около 200 строк кода на бумаге), и мне было трудно.Есть ли какие-либо советы, прежде чем приступить к созданию программы?Например, вы, ребята, уже знаете, сколько методов и какой метод они будут возвращать и использовать в качестве формального аргумента, прежде чем начнете писать код?

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Добавляя к ответу KaNa001, вы можете использовать модифицированный HashMap, где ключ - это индекс, а значение - целое число в стеке.Это не приведет к исключению, так как объект HashMap может изменить свою длину.

public class OrderSet<T> {

private HashMap<Integer, T> array;

public OrderSet() {

    array = new HashMap<Integer, T>();
}

public void addAt (T o, int pos) {
    // uses Array indexing

    HashMap<Integer, T> temp = new HashMap<Integer, T>();

    if (!(array.size() == 0)) {

        for (int i = 0; i < array.size(); i++) {

            temp.put(i, array.get(i));
        }

        array.put(pos, o);

        int size = array.size();

        for (int i = pos + 1; i < size + 1; i++) {

            array.put(i, temp.get(i - 1));
        }
    } else {

        array.put(0, o);
    }
}

public T getPos (int pos) {

    if (array.size() == 0) {

        return null;
    } else {

        return array.get(pos);
    }
}
}
0 голосов
/ 28 декабря 2018

Вы можете подойти к этому в стиле программирования.

Сначала вам нужно определить интерфейс для ADT.Просто запишите его имя и то, что он делает.

Пример:

ADT: стек целых чисел

  • void push(int element) - добавляет элемент в началоof stack
  • int pop() - удаляет и возвращает элемент из верхней части стека
  • int peek() - возвращает значение top.без удаления значения
  • boolean isEmpty() - возвращает true, если стек пуст
  • int size() - возвращает номер элемента в стеке.
  • void print() -выведите все значения стека

Далее вам нужно определиться с его реализацией.Поскольку ADT относится к хранилищу, лучше сначала определиться со стратегией хранения.

Пример:

ADT: стек целых чисел

Реализация: массив целых стеков

  • Реализует стек int с использованием встроенных в Java функций массива.
  • Поскольку массив является статической коллекцией, мне нужно использовать целочисленную переменную для отслеживания "top"

Когда все настроено, вы можете приступить к кодированию.

public interface IntegerStack {
  void push(int e);
  int pop();
  int peek();
  boolean isEmpty();
  int size();
  void print();
}

public class ArrayIntegerStack implements IntegerStack {
  private static final int INITIAL_TOP_INDEX = -1;

  private int topIndex = INITIAL_TOP_INDEX;
  private int[] stackValue = new int[Integer.MAX_VALUE];

  @Override
  public void push(int element) {
    stackValue[++topIndex] = element;
  }

  @Override
  public int pop() {
    return stackValue[topIndex--];
  }

  @Override
  public int peek() {
    return stackValue[topIndex];
  }

  @Override
  public boolean isEmpty() {
    return INITIAL_TOP_INDEX == topIndex;
  }

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

  @Override
  public void print() {
    for (int i = 0; i <= topIndex; i++) {
      System.out.println(stackValue[i]);
    }
  }
}
...