java - 如何在Java中实现只存储唯一值的堆栈

标签 java stack hashset linkedhashset

我正在尝试实现独特的堆栈。如果我尝试扩展堆栈类并使用 contains 它将查找整个堆栈,时间复杂度将变为 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;
    }
}

最佳答案

我认为最好使用常规堆栈的实例进行堆栈操作,但使用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;
    }
}

关于java - 如何在Java中实现只存储唯一值的堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60083682/

相关文章:

java - java中调用构造函数的方法

java - 并发还是顺序?

java - 链表/GUI toString()

java - Java 中缀到后缀转换的括号错误检查

java - 如何声明和初始化包含 HashSet 的 HashMap

java - JPA 2 中仅基于一个纯字符串的孤立删除

c++ - 声明一个大小不变的数组 - 编译错误

c++ - 堆栈构建程序中的两个问题

c# 获取 HashSet 的特定元素

java - Hadoop - 类型不匹配 : cannot convert from List<Text> to List<String>