-1

我需要使用该Reverse方法反转堆栈的顺序。

但是我已经尝试过了,但它不起作用:

    Dim StackObject As New Stack(Of String)
    StackObject.Push("S")
    StackObject.Push("T")
    StackObject.Push("A")
    StackObject.Push("C")
    StackObject.Push("K")

    StackObject = StackObject.Reverse.Cast(Of String)() ' <-- InvalidCastException

    For Each str As String In StackObject
        MsgBox(str)
    Next

我编写了这个通用函数来反转堆栈,但我想使用该Reverse方法而不是所有这些不必要的代码来做到这一点:

Private Function Reverse_Stack(Of T)(stack As Stack(Of T))

    Dim new_stack As New Stack(Of T)

    While Not stack.Count = 0
        new_stack.Push(stack.Pop)
    End While

    Return new_stack

End Function
4

2 回答 2

5

为什么会StackObject = StackObject.Reverse().Cast(Of String)()抛出异常?

Reverse是一种 LINQ 扩展方法,在这种情况下返回一个IEnumerable(Of String)(顺便说一句,这意味着这Cast(Of String)是多余的),因此您不能直接将结果分配给类型为 的变量Stack(Of String)

您可以使用Option Strict语句在编译时而不是在运行时捕获此错误。

那么我怎样才能扭转a Stack(Of T)

只需使用带有的Stack(Of T)构造函数IEnumerable(Of T),给它堆栈以反转:

Private Function Reverse_Stack(Of T)(stack As Stack(Of T)) As Stack(Of T)
    Return New Stack(Of T)(stack)
End Function

您甚至可以将此作为扩展方法,替换 LINQ Reverse

<Extension>
Public Function Reverse(Of T)(stack As Stack(Of T)) As Stack(Of T)
    Return New Stack(Of T)(stack)
End Function

现在你可以毫无错误地写了StackObject = StackObject.Reverse()

这是如何运作的?

Stack(Of T).GetEnumerator()按照从堆栈中弹出的顺序返回元素,并且Stack(Of T)构造函数按照元素在序列中出现的顺序将给定序列的元素压入堆栈。因此,旧堆栈顶部的元素成为新堆栈底部的元素。

于 2013-11-03T17:07:00.030 回答
3

这条线的问题

StackObject = StackObject.Reverse.Cast(Of String)()

Reverse是 . 上的扩展方法吗IEnumerable(Of T)?它产生另一个IEnumerable(Of T). 的调用Cast(Of String)是不必要的,因为序列已经包含字符串。

您可以像这样使用反向堆栈:

For Each str As String In StackObject.Reverse()
    MsgBox(str)
Next

当堆栈用作 时IEnumerable(Of T),它以与插入顺序相反的顺序生成项目。因此,上述循环将产生正确插入顺序的字母,即S, T, A, C, K

如果您想从现有堆栈中创建一个新堆栈,只需以相反的顺序,只需将堆栈传递给堆栈构造函数即可。因为堆栈以反向插入顺序(如上所述)产生值,所以新堆栈将与原始堆栈相反。

于 2013-11-03T17:14:29.017 回答