我对这里的高级OOP开发人员有疑问。 我目前是CS学生。在引入ADT的第一学期,我们学习了Java的过程编程。我了解为什么ADT很好的理论和想法,以及它的好处是什么,但是我似乎很难在代码中实现它。我感到困惑和迷茫。 除了我们的退出测试是在纸上(我们必须在纸上写大约200行代码)之外,我发现这很困难。 在开始构建程序之前,有什么技巧吗? 例如,在开始编写代码之前,你们是否已经知道多少方法以及它将返回什么方法并将其作为形式参数?
答案 0 :(得分:1)
您可以采用编程风格。
首先,您需要为ADT定义一个接口。只需写下它的名称及其作用。
示例:
ADT:整数堆栈
void push(int element)
-将元素添加到堆栈顶部int pop()
-从堆栈顶部删除并返回一个元素int peek()
-返回top的值。没有价值的清除boolean isEmpty()
-如果堆栈为空,则返回trueint size()
-返回堆栈中的元素数。void print()
-打印堆栈的所有值
下一步是您需要确定其实现。由于ADT与存储有关,因此最好先确定存储策略。
示例:
ADT:整数堆栈
实现:数组整数堆栈
- 使用Java的内置数组功能实现int堆栈。
- 由于数组是静态集合,因此我需要使用整数变量来跟踪“顶部”
设置完所有内容后,您就可以开始编码了。
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]);
}
}
}
答案 1 :(得分:1)
加上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);
}
}
}