Java中使用堆栈类的优点和缺点及可替代方案

Java中使用堆栈类的优点和缺点及可替代方案堆栈是非常常见和有用的数据结构,在处理许多问题时都很方便。 在这篇文章中,我们将讨论在Java中使用堆栈类的优点和缺点,并将探讨是否有任何替代方案来克服堆栈类的缺点。 照片:Brooke Larkon

堆栈是非常常见和有用的数据结构,在处理许多问题时都很方便。

在这篇文章中,我们将讨论在Java中使用堆栈类的优点和缺点,并将探讨是否有任何替代方案来克服堆栈类的缺点。

Java中使用堆栈类的优点和缺点及可替代方案

照片:Brooke LarkonUnsplash

首先,让我们回顾一下什么是堆栈?

在计算机科学中,堆栈是一种抽象的数据类型,作为一个元素的集合。它支持两个主要的操作:推和弹推指 的是将一个元素添加到顶部,弹指 的是将一个元素从顶部移除。

这种从顶部添加和删除元素的原则也被称为LIFO(Last In First Out)

首先,让我们来介绍一下堆栈类的不足之处

1.堆栈是一个类,而不是像其他常见的数据结构一样是一个接口。

接口数据结构的好处是,一个类可以实现多个接口,但不能继承多个类。

因此,如果你想建立一个自定义的堆栈类,而你已经扩展了一些父类,那么你就不能扩展堆栈类。

因此,从面向对象的设计角度来看,接口数据结构提供了更多的灵活性

2.堆栈类扩展了矢量类

是的,我也很震惊

理想情况下,Stack类应该只支持push()、pop()、peek()和empty()等操作。但是由于Stack是一个子类 矢量类的子类,它也有能力通过索引访问插入删除 一个元素。(你可以在这里查看它支持的所有方法)。

这基本上打破了LIFO的定义。

例如,这个代码块工作正常。它打印出12。

import java.util.Stack;
public class StackDemo {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.add(0, 10);
        stack.push(12);
        System.out.println(stack.get(1));
    }
}

3.现在,让我们来谈谈迭代的问题

回顾一下,在这篇文章的开头,我们讨论了Stack数据结构遵循LIFO原则(意思是后进先出)。

因此,如果我们对Stack对象进行迭代,我们会认为它是从上到下的(就像一叠盘子一样),但事实并非如此。

让我们通过一个例子来理解这个问题。

import java.util.Stack;
public class StackDemo {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        for (int item: stack) {
            System.out.println(item);
        }
    }
}

这个代码块的输出是

Java中使用堆栈类的优点和缺点及可替代方案

上述代码块的输出。

但是根据后进先出的原则,它应该是3,2,1吧。

如何克服这些缺点呢?

有一个叫Deque 的接口可以克服上述的大部分缺点。让我们详细地看一下例子。

1.首先,它是一个接口

Deque是一个接口,所以我们可以灵活地创建自定义的Stack类,它可以继承 其他的类,实现 其他的接口,在此基础上还可以实现Deque接口

2.不允许通过索引访问、插入和删除元素

Deque不允许通过其索引来访问、插入和删除元素。但由于它是一个双端队列,它支持从两端插入和删除。

因此,即使Deque不遵循后进先出的原则,但它显然比Stack类要好,Stack类曾经允许基于索引的插入/删除。

3.Deque在迭代中遵循LIFO顺序

当我们迭代一个Deque实例时,它从上到下迭代,就像堆栈数据结构所期望的那样。

让我们通过一个例子来理解这一点。

import java.util.Stack;
public class StackDemo {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        for (int item: stack) {
            System.out.println(item);
        }
    }
}

这个代码块的输出是。

Java中使用堆栈类的优点和缺点及可替代方案

上述代码块的输出

我们可以看到它是从上到下的。

因此,总的来说,我们可以观察到,使用Deque来实现堆栈数据结构更有意义。

但有一点需要注意的是。让我们来谈谈这个问题。

多线程

由于Stack类是Vector的一个子类,而Vector类是同步的 ,因此即使Stack类也是同步的。

另一方面,Deque接口不是线程安全的

因此,如果线程安全是一个问题,我们应该坚持使用Stack类,因为它仍然可以完成我们现在所知道的一些注意事项的工作。

我强烈建议你浏览一下上述主题的Java文档。

  1. docs.oracle.com/javase/8/do…
  2. docs.oracle.com/javase/8/do…
  3. docs.oracle.com/javase/7/do…
  4. docs.oracle.com/javase/7/do…

Java中使用堆栈类的优点和缺点及可替代方案

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/36684.html

(0)
上一篇 2023-11-16
下一篇 2023-11-16

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注