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。如果您不想每次需要访问双端队列时都检查它的大小,那么您应该使用removeFirstOrNull和removeLastOrNull函数。
可选片段
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)
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)
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)
等等
我不相信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链接以获取模型实现
| 归档时间: |
|
| 查看次数: |
11145 次 |
| 最近记录: |