【问题标题】:Creating a Stack Generic ArrayList useing a interface使用接口创建 Stack Generic ArrayList
【发布时间】:2020-06-23 11:03:51
【问题描述】:

这是一个关于泛型和实现堆栈(LIFO)的练习题,不能在现实生活中使用它是为了教育目的。

所有接口方法不能带不同的参数,必须按照图示的方式实现。

接口栈

import java.util.Iterator;
interface Stack<E>{
    public boolean push(E x);
    public boolean pop();
    public E top();
    public boolean empty();
    public boolean full();
    public Iterator<E> iterator();
}

我不知道如何处理 iterator 方法,或者为什么我需要它,因为我的方法都没有使用它?

我已经完成了下面代码中的所有其他方法

我的堆栈

import java.util.ArrayList;
import java.util.Iterator;


public class MyStack<E> implements Stack<E>,Iterable<E> {

    //Creating a ArrayList which is bound using a int
    //in the constructor and size keeps track of the 
    //amount of elements in the ArrayLIst
    private int size;
    private ArrayList<E> stack;

    public MyStack(int size) {
        stack = new ArrayList<E>(size);
        size = 0;
    }

    @Override
    public boolean push(E x) {
        //Check to make sure the size of the bounded Arraylist
        //has not been exceeded, if not add element 
        if(size == stack.size()) {
            stack.add(x);
            size++;
            return true;
        }

        return false;

    }

    @Override

    public boolean pop() {
        //If the list is not empty remove the last element 
        if(this.empty()) {
            System.out.println("No elements to remove");
            return false;
        }

        stack.remove(stack.size()-1);
        size--;
        return true;
    }

    @Override
    public E top() {
        //If the stack is not empty return the top element without removing it
        if (empty()) {
            return null;
        }       
        else
            return stack.get(stack.size()-1);       
    }

    @Override
    public boolean empty() {

        return stack.isEmpty();
    }

    @Override
    public boolean full() {

        //If size is equal to the size of the stack
        //it is deemed full
        if(size == stack.size()) {
            System.out.println("The stack is full");
            return true;
        }

        return false;
    }

    @Override
    public Iterator iterator() {
        // TODO Auto-generated method stub
        return null;
    }


    @Override
    public String toString() {
        return "MyStack [size=" + size + ", stack=" + stack + "]";
    }

}

测试代码

    stack.push(2);
    stack.push(4);
    stack.push(5);
    stack.push(7);

    System.out.println(stack.toString());

    System.out.println(stack.top());
    stack.pop();
    stack.empty();

    System.out.println(stack.toString());

所有方法似乎都可以正常工作

MyStack [size=4, stack=[2, 4, 5, 7]] 7 MyStack [size=4, stack=[2, 4, 5]]

我唯一的其他困惑是在我的书中,它显示了一个添加到头部的图表,其中我的 Arraylist 添加到尾部,但将尾部视为头部,这样可以吗?

这有点令人困惑,因为他们还在本章中讨论了 LinkedList,这就是这个 daigram 在我看来代表的内容,而不是 ArrayList

书中使用的方法

@Override
    public Iterator<E> iterator() {
          ArrayList<E> tmp = new ArrayList<>();

            int ind = stack.size();
            while(ind > 0){
              tmp.add(stack.get(ind-1));
                ind--;
            }
            System.out.println(tmp.toString());
            return tmp.iterator();
    }

【问题讨论】:

  • iterator() 方法应该返回一个可以遍历整个堆栈的对象。在你的情况下,它指向一个堆栈对象,它可以测试它之后是否有一个对象(hasNext())并返回当前对象并将它的指针设置为下一个对象(next()
  • 我知道这些方法,但我仍然不明白为什么我在书中需要它,现在使用的方法是问题所在。这将返回一个 List 反转的对象,但它不使用任何迭代器方法,我只能看到它用于视觉表示是正确的吗?

标签: java arraylist interface stack


【解决方案1】:

正如 dan1st 在 cmets 中已经提到的,Iterator 用于遍历/迭代整个堆栈并提供一些函数来与堆栈的元素进行交互。

查看Iterator interface 的文档。

一般来说,接口(您的堆栈)提供的方法不一定必须在您自己的实现中使用,而是为用户提供一些操作以与您的实现进行交互。

我唯一的其他困惑是在我的书中,它显示了一个添加到头部的图表,其中我的 Arraylist 添加到尾部,但将尾部视为头部,这样可以吗?

如果需要向头部添加新元素,那就去吧。它改变了堆栈元素的顺序。 这是一个很好的提示如何在您的书中使用 iterate() 实现。

【讨论】:

  • 顺便说一句,如果 OP 不想实现iterator(),他应该抛出一个UnsupportedOperationException 而不是留空...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 2017-08-18
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2015-01-14
相关资源
最近更新 更多