【问题标题】:Stack that you can move nth element to the top of the stack您可以将第 n 个元素移动到堆栈顶部的堆栈
【发布时间】:2019-02-02 01:42:33
【问题描述】:

我正在寻找一个 Stack 数据结构,它还允许将第 n 个元素移动到堆栈顶部。因此,除了 pop()、push()、peek() 之外,我还想要 moveToTop(int n) 之类的东西,其中栈顶 n=0 和栈底 n=size-1。

实现它的最佳方式是什么?我正在使用 Java。

【问题讨论】:

  • 您可以实现自己的堆栈。

标签: java algorithm data-structures


【解决方案1】:

标准堆栈数据结构中没有 moveToTop 方法,但如果你想这样做,我认为你可以实现如下:

public class MyStack<T> extends Stack<T>{

    public synchronized void moveToTop(int n) throws Exception {
        int size = this.size();
        if(n>size) {
            throw new Exception("error position");
        }
        T ele = remove(n);
        push(ele);
    }
}

【讨论】:

  • 我认为在 Stack 实现中没有将索引作为参数的 remove() 方法。
  • 大声笑,这里我只是重用了java库中的堆栈,stack.remove继承自verctor.remove,如果你使用其他语言,你可以实现更多的deails,例如:remove,push或者如果c++,使用 STL
【解决方案2】:

为什么要重新发明?简单就是 Stack 类 https://docs.oracle.com/javase/8/docs/api/java/util/Stack.html 它从 Vector 继承 remove(int index)。

【讨论】:

    【解决方案3】:

    您可以创建另一个数组或其他底层结构来临时保存项目。将项目 n 前面的项目移动到该项目中,将该项目推回并将您想要的项目推到该项目的顶部。

    public class MyStack<T> {
        T items[size];
        ....
        void moveToTop(int n)
        {
            T obj = items[n];
            T[] tempItems = new T[n - 1];
            Arrays.copyOf(items, n - 1);
            System.arraycopy(items, 0, tempItems, 0, n - 1);
            System.arraycopy(tempItems, 0, items, 1, n - 1);
            items[0] = obj;
        }
        ....
    }
    

    为简洁起见,删除了其他部分。 您可以检查双链表或跳过列表,而不是做所有这些麻烦。

    【讨论】:

      【解决方案4】:

      java.util.LinkedList 满足您的要求,因为它同时是linked list / stack / queue

      相关方法:

      • public E remove(int index)
        按索引移除,并获取移除的值。
      • public void push(E e)
        推到顶部。

      那么,你需要做的是:

      • 找出索引。
      • 按索引删除,并获取返回值。
      • 将返回值推到顶部。

      【讨论】:

        【解决方案5】:

        我知道有几种实现堆栈的方法:

        - 使用 Vector 的扩展实现它

        - 使用任何 List 组件实现它

        - 将其实现为链接数据结构

        - 使用底层 Java Array 实现它

        我建议您使用底层 Java Array 来实现它。与其他人相比很难实现,但理解逻辑会非常有帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-02
          • 2017-03-15
          • 2020-06-04
          • 1970-01-01
          • 2011-08-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多