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

时间:2017-10-23 23:40:41

标签: kotlin

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

或者还有其他选择吗?

  • 我试图将列表转换为堆栈

谢谢

7 个答案:

答案 0 :(得分:10)

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]

答案 1 :(得分:8)

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

import java.util.Stack
...
val someList = ArrayList()
...
val stack = Stack()
stack.addAll(someList)

答案 2 :(得分:7)

这已经有几年历史了,但我怀疑还有其他方法的空间。如果您想在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 

然后,可选地,您可以使用typealias使使用这些功能时要执行的操作更加明显:

typealias Stack = MutableList<MyClass>

然后创建一个并使用它:

val myStack: Stack = mutableListOf()
myStack.push(MyClass())
myStack.pop()

答案 3 :(得分:5)

您可以使用以下内容:

/**
 * 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

答案 4 :(得分:4)

我不相信Kotlin中有Stack的特定单独实现。你绝对可以使用Ed的答案。

或者,您可以使用mutableListOf<DataType>构造,然后使用自定义方法。

这将是这样的:

var stackDemo = mutableListOf<String>()

推送元素

var count = stackDemo.count()
stackDemo.add(count,"One")

弹出元素

var count = stackDemo.count()
stackDemo.removeAt(count)

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

答案 5 :(得分:3)

你可以像它一样定义Stack。

val stack = Stack<YourStackType>()

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

val stack = Stack<Int>()

之后,您可以使用推送,弹出或其他堆栈操作

Int堆栈的示例:

a:Int = 10
stack.push(a)
a = stack.pop()

答案 6 :(得分:2)

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)

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


可选片段

ArrayDeque 构造函数:

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

Stack 之类的 ArrayDeque 调用:

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

inline fun <T> ArrayDeque<T>.pop() = removeLastOrNull()          // returns T?