我怎样才能在Kotlin中使用堆栈?

9 kotlin

如何在Kotlin中使用Stack(来自java)?

或者还有其他选择吗?

  • 我正在尝试将列表转换为堆栈

谢谢

Mao*_*aow 65

Kotlin 1.3.70引入了该类kotlin.collections.ArrayDeque,它既充当队列又充当堆栈,就像 Java 的一样java.util.Deque(Deque 意思是“双端队列”)。它是出于多平台ArrayDeque实施的需要而创建的。

val stack = ArrayDeque(listOf(1, 2, 3)) // stack: [1, 2, 3]
stack.addLast(0)                        // stack: [1, 2, 3, 0]         (push)
val value = stack.removeLast()          // value: 0, stack: [1, 2, 3]  (pop)
Run Code Online (Sandbox Code Playgroud)

请注意,如果ArrayDeque调用removeFirstor时 an 为空removeLast,则会抛出 a kotlin.NoSuchElementException。如果您不想每次需要访问双端队列时都检查它的大小,那么您应该使用removeFirstOrNullremoveLastOrNull函数。


可选片段

ArrayDeque构造函数:

inline fun <T> arrayDequeOf(vararg elements: T) = ArrayDeque(elements.toList())
// ...
val stack = arrayDequeOf(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

Stack-类似ArrayDeque调用:

inline fun <T> ArrayDeque<T>.push(element: T) = addLast(element) // returns Unit

inline fun <T> ArrayDeque<T>.pop() = removeLastOrNull()          // returns T?
Run Code Online (Sandbox Code Playgroud)


小智 23

import java.util.ArrayDeque

var stack = ArrayDeque<Int>()
stack.push(1)
stack.push(2)
stack.push(3)
stack.push(4)
println(stack)           // --> [4, 3, 2, 1]
println(stack.isEmpty()) // --> false

println(stack.peek())    // --> 4
println(stack)           // --> [4, 3, 2, 1]

println(stack.pop())     // --> 4
println(stack)           // --> [3, 2, 1]

stack.push(9)
println(stack)           // --> [9, 3, 2, 1]
Run Code Online (Sandbox Code Playgroud)

  • 在这个线程中应该更多地提到这一点 - 不要使用 Stack,而是使用 Deque。原因:/sf/ask/876737851/ (2认同)

Mal*_*ngh 13

您可以使用以下内容:

/**
 * Stack as type alias of Mutable List
 */
typealias Stack<T> = MutableList<T>

/**
 * Pushes item to [Stack]
 * @param item Item to be pushed
 */
inline fun <T> Stack<T>.push(item: T) = add(item)

/**
 * Pops (removes and return) last item from [Stack]
 * @return item Last item if [Stack] is not empty, null otherwise
 */
fun <T> Stack<T>.pop(): T? = if (isNotEmpty()) removeAt(lastIndex) else null

/**
 * Peeks (return) last item from [Stack]
 * @return item Last item if [Stack] is not empty, null otherwise
 */
fun <T> Stack<T>.peek(): T? = if (isNotEmpty()) this[lastIndex] else null
Run Code Online (Sandbox Code Playgroud)


Ed *_*wey 10

这与在Java中使用的方式相同,但使用Kotlin语法 - val关键字和缺少新关键字的区别不同.例如:

import java.util.Stack
...
val someList = ArrayList()
...
val stack = Stack()
stack.addAll(someList)
Run Code Online (Sandbox Code Playgroud)

  • 正如对问题的评论中所述,应该使用 Deque 而不是 Stack。/sf/ask/876737851/ (3认同)

Ali*_*Ali 10

您可以像这样定义 Stack。

val stack = Stack<YourStackType>()
Run Code Online (Sandbox Code Playgroud)

请注意,设置堆栈的数据类型,例如 Int 堆栈是这样的:

val stack = Stack<Int>()
Run Code Online (Sandbox Code Playgroud)

之后,您可以使用 push 、 pop 或其他堆栈操作

Int 堆栈示例:

a:Int = 10
stack.push(a)
a = stack.pop()
Run Code Online (Sandbox Code Playgroud)


ada*_*tlx 10

这已经有几年了,但我怀疑还有空间采用不同的方法。如果您想在 Kotlin 中使用堆栈结构,您当然不需要求助于 Java。您可以轻松地创建一个带有内部 Kotlin 列表和类似堆栈的公共函数的新类,或者使用 Kotlin 的扩展方法为现有的 Kotlin 集合提供“类似堆栈”的功能,例如:

fun <T> MutableList<T>.push(item: T) = this.add(this.count(), item)
fun <T> MutableList<T>.pop(): T? = if(this.count() > 0) this.removeAt(this.count() - 1) else null
fun <T> MutableList<T>.peek(): T? = if(this.count() > 0) this[this.count() - 1] else null
fun <T> MutableList<T>.hasMore() = this.count() > 0 
Run Code Online (Sandbox Code Playgroud)

然后,可选地,您可以使用 typealias 使您在使用这些函数时尝试执行的操作更加明显:

typealias Stack = MutableList<MyClass>
Run Code Online (Sandbox Code Playgroud)

然后创建一个并使用它:

val myStack: Stack = mutableListOf()
myStack.push(MyClass())
myStack.pop()
Run Code Online (Sandbox Code Playgroud)

等等


Sat*_*j S 5

我不相信Kotlin中有Stack的特定实现。您肯定可以使用Ed的答案。

或者,您可以使用mutableListOf<DataType>构造,然后在此之上具有自定义方法。

就像这样:

var stackDemo = mutableListOf<String>()
Run Code Online (Sandbox Code Playgroud)

推元素

var count = stackDemo.count()
stackDemo.add(count,"One")
Run Code Online (Sandbox Code Playgroud)

弹出元素

var count = stackDemo.count()
stackDemo.removeAt(count)
Run Code Online (Sandbox Code Playgroud)

您可以参考此Github链接以获取模型实现