Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
|
|
@ -0,0 +1,121 @@
|
|||
Option Strict On
|
||||
|
||||
Imports System.Text.RegularExpressions
|
||||
|
||||
Module Module1
|
||||
|
||||
Class Operator_
|
||||
Sub New(t As Char, p As Integer, Optional i As Boolean = False)
|
||||
Token = t
|
||||
Precedence = p
|
||||
IsRightAssociative = i
|
||||
End Sub
|
||||
|
||||
Property Token As Char
|
||||
Get
|
||||
Return m_token
|
||||
End Get
|
||||
Private Set(value As Char)
|
||||
m_token = value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Property Precedence As Integer
|
||||
Get
|
||||
Return m_precedence
|
||||
End Get
|
||||
Private Set(value As Integer)
|
||||
m_precedence = value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Property IsRightAssociative As Boolean
|
||||
Get
|
||||
Return m_right
|
||||
End Get
|
||||
Private Set(value As Boolean)
|
||||
m_right = value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Private m_token As Char
|
||||
Private m_precedence As Integer
|
||||
Private m_right As Boolean
|
||||
End Class
|
||||
|
||||
ReadOnly operators As New Dictionary(Of Char, Operator_) From {
|
||||
{"+"c, New Operator_("+"c, 2)},
|
||||
{"-"c, New Operator_("-"c, 2)},
|
||||
{"/"c, New Operator_("/"c, 3)},
|
||||
{"*"c, New Operator_("*"c, 3)},
|
||||
{"^"c, New Operator_("^"c, 4, True)}
|
||||
}
|
||||
|
||||
Class Expression
|
||||
Public Sub New(e As String)
|
||||
Ex = e
|
||||
End Sub
|
||||
|
||||
Sub New(e1 As String, e2 As String, o As Operator_)
|
||||
Ex = String.Format("{0} {1} {2}", e1, o.Token, e2)
|
||||
Op = o
|
||||
End Sub
|
||||
|
||||
ReadOnly Property Ex As String
|
||||
ReadOnly Property Op As Operator_
|
||||
End Class
|
||||
|
||||
Function PostfixToInfix(postfix As String) As String
|
||||
Dim stack As New Stack(Of Expression)
|
||||
|
||||
For Each token As String In Regex.Split(postfix, "\s+")
|
||||
Dim c = token(0)
|
||||
Dim op = operators.FirstOrDefault(Function(kv) kv.Key = c).Value
|
||||
If Not IsNothing(op) AndAlso token.Length = 1 Then
|
||||
Dim rhs = stack.Pop()
|
||||
Dim lhs = stack.Pop()
|
||||
|
||||
Dim opPrec = op.Precedence
|
||||
|
||||
Dim lhsPrec = If(IsNothing(lhs.Op), Integer.MaxValue, lhs.Op.Precedence)
|
||||
Dim rhsPrec = If(IsNothing(rhs.Op), Integer.MaxValue, rhs.Op.Precedence)
|
||||
|
||||
Dim newLhs As String
|
||||
If lhsPrec < opPrec OrElse (lhsPrec = opPrec AndAlso c = "^") Then
|
||||
'lhs.Ex = "(" + lhs.Ex + ")"
|
||||
newLhs = "(" + lhs.Ex + ")"
|
||||
Else
|
||||
newLhs = lhs.Ex
|
||||
End If
|
||||
|
||||
Dim newRhs As String
|
||||
If rhsPrec < opPrec OrElse (rhsPrec = opPrec AndAlso c <> "^") Then
|
||||
'rhs.Ex = "(" + rhs.Ex + ")"
|
||||
newRhs = "(" + rhs.Ex + ")"
|
||||
Else
|
||||
newRhs = rhs.Ex
|
||||
End If
|
||||
|
||||
stack.Push(New Expression(newLhs, newRhs, op))
|
||||
Else
|
||||
stack.Push(New Expression(token))
|
||||
End If
|
||||
|
||||
'Print intermediate result
|
||||
Console.WriteLine("{0} -> [{1}]", token, String.Join(", ", stack.Reverse().Select(Function(e) e.Ex)))
|
||||
Next
|
||||
|
||||
Return stack.Peek().Ex
|
||||
End Function
|
||||
|
||||
Sub Main()
|
||||
Dim inputs = {"3 4 2 * 1 5 - 2 3 ^ ^ / +", "1 2 + 3 4 + ^ 5 6 + ^"}
|
||||
For Each e In inputs
|
||||
Console.WriteLine("Postfix : {0}", e)
|
||||
Console.WriteLine("Infix : {0}", PostfixToInfix(e))
|
||||
Console.WriteLine()
|
||||
Next
|
||||
Console.ReadLine() 'remove before submit
|
||||
End Sub
|
||||
|
||||
End Module
|
||||
Loading…
Add table
Add a link
Reference in a new issue