【问题标题】:How to implement stack which stores only unique values in Java如何在Java中实现仅存储唯一值的堆栈
【发布时间】:2020-05-21 19:59:46
【问题描述】:

我正在尝试实现唯一堆栈。如果我尝试扩展堆栈类并使用包含,它将查看整个堆栈,时间复杂度将变为 O(n)。所以我尝试扩展 LinkedHashSet,它会自行删除重复项并保持顺序。我能够实现除pop之外的所有方法。

有人可以在这里分享想法吗?

import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Stack;
import java.util.stream.Stream;

public class UniqueStack<E> extends LinkedHashSet<E>{

    private int size = 0;

    @Override
    public Stream<E> stream() {
        return super.stream();
    }

    public boolean push(E e) {
        if (!contains(e)) {
            ++size;
            return super.add(e);
        }
        return false;
    }

    public E pop() {       
       // struck here
    return;
    }
}

【问题讨论】:

  • 为什么不同时使用StackHashSet 作为UniqueStack 的一部分?此外,Stack 应替换为 ArrayDeque
  • @JacobG。如果我使用堆栈和 HashSet。我必须在堆栈和哈希集中存储相同的数据。我将结束,维护相同的数据。它会消耗更多的内存
  • 内存真的是个问题吗?您最多会存储多少个元素?
  • 我需要抓取一个网站。其中有数百万个网址。我将使用 DFS。所以我需要堆栈。
  • 无论您使用 Stack/HashSet 组合还是 LinkedHashSet,所需的内存量都是相同的,只要您存储对象即可。如果你想要 O(1) 的性能,你需要一个集合,如果你想要一个堆栈,你需要一个堆栈或链表。 LinkedHashSet 通过将对自身的引用存储为哈希集和链表的一部分来组合两者。

标签: java stack hashset linkedhashset


【解决方案1】:

我相信最好使用常规堆栈的instance 进行堆栈操作,但使用HashSet 的效率来跟踪重复项。可以使用相同的想法添加其他方法。

    UniqueStack<Integer> stack = new UniqueStack<>();

    stack.push(10);
    stack.push(20);
    stack.push(30);
    stack.push(40);
    stack.push(30); // ignored
    stack.push(50);

    System.out.println(stack);
    int v = stack.pop();
    System.out.println(v);
    System.out.println(stack);
    stack.push(1);
    stack.push(2);
    System.out.println(stack);
    v = stack.pop();
    System.out.println(v);
    System.out.println(stack);

这个输出是

[10, 20, 30, 40, 50]
50
[10、20、30、40]
[10、20、30、40、1、2]
2
[10、20、30、40、1]

class UniqueStack<E> extends LinkedHashSet<E> {

    Stack<E> stack = new Stack<>();
    private int size = 0;


    public Stream<E> stream() {
        return stack.stream();
    }

    public boolean push(E e) {
        if (!contains(e)) {
            ++size;
            stack.push(e);
            return add(e);
        }
        return false;
    }

    public E pop() {
        E val = null;
        if (!stack.isEmpty()) {
            --size;
            val = stack.pop();
            remove(val);
        }
        return val;
    }
}

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 2020-11-17
    • 2013-12-18
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 2017-02-23
    • 2016-03-05
    相关资源
    最近更新 更多