Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
|
|
@ -0,0 +1,110 @@
|
|||
Option Explicit
|
||||
Option Base 1
|
||||
|
||||
Function ShuntingYard(strInfix As String) As String
|
||||
Dim i As Long, j As Long, token As String, tokenArray() As String
|
||||
Dim stack() As Variant, queue() As Variant, discard As String
|
||||
Dim op1 As String, op2 As String
|
||||
|
||||
Debug.Print strInfix
|
||||
|
||||
' Get tokens
|
||||
tokenArray = Split(strInfix)
|
||||
|
||||
' Initialize array (removed later)
|
||||
ReDim stack(1)
|
||||
ReDim queue(1)
|
||||
|
||||
' Loop over tokens
|
||||
Do While 1
|
||||
i = i + 1
|
||||
If i - 1 > UBound(tokenArray) Then
|
||||
Exit Do
|
||||
Else
|
||||
token = tokenArray(i - 1) 'i-1 due to Split returning a Base 0
|
||||
End If
|
||||
If token = "" Then: Exit Do
|
||||
|
||||
' Print
|
||||
Debug.Print i, token, Join(stack, ","), Join(queue, ",")
|
||||
' If-loop over tokens (either brackets, operators, or numbers)
|
||||
If token = "(" Then
|
||||
stack = push(token, stack)
|
||||
ElseIf token = ")" Then
|
||||
While Peek(stack) <> "("
|
||||
queue = push(pop(stack), queue)
|
||||
Wend
|
||||
discard = pop(stack) 'discard "("
|
||||
ElseIf isOperator(token) Then
|
||||
op1 = token
|
||||
Do While (isOperator(Peek(stack)))
|
||||
' Debug.Print Peek(stack)
|
||||
op2 = Peek(stack)
|
||||
If op2 <> "^" And precedence(op1) = precedence(op2) Then
|
||||
'"^" is the only right-associative operator
|
||||
queue = push(pop(stack), queue)
|
||||
ElseIf precedence(op1$) < precedence(op2$) Then
|
||||
queue = push(pop(stack), queue)
|
||||
Else
|
||||
Exit Do
|
||||
End If
|
||||
Loop
|
||||
stack = push(op1, stack)
|
||||
Else 'number
|
||||
'actually, wrong operator could end up here, like say %
|
||||
'If the token is a number, then add it to the output queue.
|
||||
queue = push(CStr(token), queue)
|
||||
End If
|
||||
Loop
|
||||
|
||||
While stack(1) <> ""
|
||||
If Peek(stack) = "(" Then Debug.Print "no matching ')'": End
|
||||
queue = push(pop(stack), queue)
|
||||
Wend
|
||||
|
||||
' Print final output
|
||||
ShuntingYard = Join(queue, " ")
|
||||
Debug.Print "Output:"
|
||||
Debug.Print ShuntingYard
|
||||
End Function
|
||||
|
||||
'------------------------------------------
|
||||
Function isOperator(op As String) As Boolean
|
||||
isOperator = InStr("+-*/^", op) <> 0 And Len(op$) = 1
|
||||
End Function
|
||||
|
||||
Function precedence(op As String) As Integer
|
||||
If isOperator(op$) Then
|
||||
precedence = 1 _
|
||||
- (InStr("+-*/^", op$) <> 0) _
|
||||
- (InStr("*/^", op$) <> 0) _
|
||||
- (InStr("^", op$) <> 0)
|
||||
End If
|
||||
End Function
|
||||
|
||||
'------------------------------------------
|
||||
Function push(str, stack) As Variant
|
||||
Dim out() As Variant, i As Long
|
||||
If Not IsEmpty(stack(1)) Then
|
||||
out = stack
|
||||
ReDim Preserve out(1 To UBound(stack) + 1)
|
||||
out(UBound(out)) = str
|
||||
Else
|
||||
ReDim out(1 To 1)
|
||||
out(1) = str
|
||||
End If
|
||||
push = out
|
||||
End Function
|
||||
|
||||
Function pop(stack)
|
||||
pop = stack(UBound(stack))
|
||||
If UBound(stack) > 1 Then
|
||||
ReDim Preserve stack(1 To UBound(stack) - 1)
|
||||
Else
|
||||
stack(1) = ""
|
||||
End If
|
||||
End Function
|
||||
|
||||
Function Peek(stack)
|
||||
Peek = stack(UBound(stack))
|
||||
End Function
|
||||
Loading…
Add table
Add a link
Reference in a new issue