如何在Java中逆转堆栈?(附教程)

如何在Java中逆转堆栈?(附教程)大家好,如果你想知道如何在Java中还原一个堆栈,那么就不要乱跑。在这篇文章中,我将一步一步地告诉你 如何在Java中逆转一个给定的堆栈。有两种方法来逆转堆栈,你可以使用迭代 或递归。最常见的反转堆栈

大家好,如果你想知道如何在Java中还原一个堆栈,那么就不要乱跑。在这篇文章中,我将一步一步地告诉你 如何在Java中逆转一个给定的堆栈。有两种方法来逆转堆栈,你可以使用迭代 或递归。最常见的反转堆栈的方法是使用一个辅助堆栈。首先,我们将从堆栈中弹出所有的元素并将它们推入辅助堆栈。一旦所有的元素被推入辅助堆栈,那么它就包含了相反顺序的元素,我们只需打印它们。但是,在这里,我们将不使用辅助堆栈。我们将使用递归方法来反转堆栈,递归意味着一次又一次地调用函数本身。
我所说的辅助堆栈是什么意思?辅助数据结构是一种甜美的说法,即辅助数据结构。你可能用来解决某个问题的东西,在问题解决后就终止了。

例如,如果我要求你找到我在一个数组中的每个元素的数量。一种方法是通过使用哈希表(键值对)来实现。你可以把表中的元素作为键,把它们的出现次数作为值。

然后你可以遍历这个表,找到每个元素的出现次数。在你得到出现次数之后,你就不需要这个表了,因此,它是一个辅助性的数据结构。暂时占用了额外的空间。

在递归方法中,我们首先从输入栈中弹出所有的元素,并将所有弹出的项目推入函数调用栈,直到栈变空。当堆栈变空时,所有的项目将被推到堆栈中。

Btw,这也是 Java面试中常见的 堆栈编码问题之一,如果你需要更多的堆栈问题,那么你也可以查看那篇文章

如何使用递归在Java中反转一个堆栈?代码示例

堆栈 是一种 类似于数组和链接列表 的线性数据结构 ,允许我们按顺序存储和检索数据。一般来说,插入操作被称为 “推”, 删除操作被称为 “弹”。 当需要动态添加和删除元素时,它们很有用。

在任何时候,人们只能访问堆栈的顶部元素。由于这个原因,它是一个 LIFO(Last In First Out)数据结构。在这种情况下,最后加入的元素被首先访问。栈中所有操作的时间复杂度是 O(1),使其高效并提高性能。

在堆栈数据结构中,如上所述,最后一个项目是第一个出来的。想一想,洗完后放在自己身上的盘子。对!就是这样。这正是堆栈数据结构。把第一个进入的项目先拿出来是没有逻辑意义的。

你这样做意味着你已经离开了堆栈数据结构,你已经进入了另一种类型的数据结构。在这里,我们要反转一个堆栈。想象一下,你有数字1-10存储在一个堆栈中,现在我们要实现它的反面存储,这意味着10-1,让我们开始吧!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class StackReversion {
  static Stack < Character > stack = new Stack < > ();
  static void insert_at_bottom(char x) {
    if (stack.isEmpty())
      stack.push(x);
    else {
      char a = stack.peek();
      stack.pop();
      insert_at_bottom(x);
      stack.push(a);
    }
  }
  static void reverse() {
    if (stack.size() > 0) {
      char x = st.peek();
      stack.pop();
      reverse();
      insert_at_bottom(x);
    }
  }
  // Driver Code 
  public static void main(String[] args) {
    stack.push('1');
    stack.push('2');
    stack.push('3');
    stack.push('4');
    System.out.println("Original Stack");
    System.out.println(stack);
    reverse();
    System.out.println("Reversed Stack");
    System.out.println(stack);
  }
}

解决方案和代码的解释

第1行是类的声明,第2行引入了堆栈,它以字符为类型。注意:因为堆栈不能容纳原始类型,它必须自动装箱为引用类型,这就是为什么字符是一个大写字母,有一个变量名stack,它被初始化为新的堆栈。

在第3行,创建了 “insertFromBottom “方法,它接收了一个字符类型的参数,所以如果堆栈是空的,它应该推入这个参数,但如果不是,它应该继续执行其余的代码。所以第19行的执行方式是偷看顶部的项目并保存在一个变量中。

在调用了peek方法后,又调用了reverse方法。

因此,”反向 “方法的实现是这样的:第15行,创建了 “反向 “方法,该方法返回无效。所以,如果堆栈的大小大于0,那么peek方法就会被调用并存储在变量中,然后,pop方法也会进行工作,弹出元素,之后就是递归调用。

这种情况一直在发生,直到它到达堆栈的末端。每次递归调用后,”insertFromBottom “方法总是被调用。

驱动类:
第26行声明了main方法。从第28行到第31行,四个不同的项目被推入堆栈,分别是1、2、3、4。第33行和第35行打印原始堆栈,之后调用reverse()方法,然后打印反转后的堆栈。

OUTPUT

Original Stack:
[

这就是关于如何在Java中逆转堆栈的全部内容。这不仅是一个学习Stack的好练习,也是学习递归的好练习,以及如何使用适当的数据结构将一个迭代方案转换为递归方案。

堆栈是重要的数据结构之一,我相信每个程序员都应该了解它并熟悉它的属性。我主要使用堆栈将交互式算法转换为递归式算法,就像本例中一样。如果你对这个解决方案或解释有任何疑问,请随时提问。

相关的数据结构和算法面试问题来自Javarevisited博客

  • 前15个数据结构和算法的面试问题(见此)
  • 前20个字符串编码的面试问题(见这里)
  • 如何在Java中使用泛型实现一个链接列表?(解决方案)
  • 如何在Java中反转一个单链表?(解决方法)
  • 如何使用单链表找到中间的元素?(解决方法)
  • 过去5年的133个核心Java面试问题(见此)。
  • 前30个数组编码面试题及答案(见此)。
  • 前30个链接列表编码面试题(见此)
  • 如何在Java中找到链表末端的第3个元素?(解决方案)
  • 编码面试中的前50个Java程序(见此)
  • 面向程序员的5个免费数据结构和算法课程(课程)
  • 10本每个程序员都应该阅读的算法书籍(书籍)
  • 面向程序员的10个免费数据结构和算法课程(课程)
  • 100+面试中的数据结构编码问题(问题)

感谢你到目前为止阅读这个编码问题解决方案。如果你喜欢这篇文章,那么请与你的朋友和同事分享它。如果你有任何问题或疑问,那么请让我们知道,我会努力为你找到答案。像往常一样,我们非常欢迎建议、评论、创新和更好的答案。

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

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

相关推荐

发表回复

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