Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
|
|
@ -0,0 +1,103 @@
|
|||
' Parsing/RPN calculator algorithm
|
||||
DECLARE SUB MakeEmpty (S AS ANY)
|
||||
DECLARE SUB Push (X AS SINGLE, S AS ANY)
|
||||
DECLARE SUB PrintStack (S AS ANY)
|
||||
DECLARE SUB EvalRPN (Expr$)
|
||||
DECLARE FUNCTION Empty% (S AS ANY)
|
||||
DECLARE FUNCTION Pop! (S AS ANY)
|
||||
|
||||
CONST MAXINDEX = 63
|
||||
|
||||
TYPE TNumStack
|
||||
TopIndex AS INTEGER
|
||||
Elems(MAXINDEX) AS SINGLE
|
||||
END TYPE
|
||||
|
||||
EvalRPN ("3 4 2 * 1 5 - 2 3 ^ ^ / +")
|
||||
END
|
||||
|
||||
FUNCTION Empty% (S AS TNumStack)
|
||||
Empty% = S.TopIndex > MAXINDEX
|
||||
END FUNCTION
|
||||
|
||||
SUB EvalRPN (Expr$)
|
||||
DIM S AS TNumStack
|
||||
MakeEmpty S
|
||||
PRINT "Input", "Operation", "Stack after"
|
||||
' SP% - start position of token
|
||||
' DP% - position of delimiter
|
||||
DP% = 0
|
||||
DO
|
||||
SP% = DP% + 1
|
||||
DP% = INSTR(DP% + 1, Expr$, " ")
|
||||
IF DP% <> 0 THEN
|
||||
TE% = DP% - 1
|
||||
Token$ = MID$(Expr$, SP%, DP% - SP%)
|
||||
ELSE
|
||||
Token$ = MID$(Expr$, SP%, LEN(Expr$) - SP% + 1)
|
||||
END IF
|
||||
PRINT Token$,
|
||||
IF Token$ = "*" THEN
|
||||
PRINT "Operate",
|
||||
Second = Pop(S): First = Pop(S)
|
||||
Push First * Second, S
|
||||
ELSEIF Token$ = "/" THEN
|
||||
PRINT "Operate",
|
||||
Second = Pop(S): First = Pop(S)
|
||||
Push First / Second, S
|
||||
ELSEIF Token$ = "-" THEN
|
||||
PRINT "Operate",
|
||||
Second = Pop(S): First = Pop(S)
|
||||
Push First - Second, S
|
||||
ELSEIF Token$ = "+" THEN
|
||||
PRINT "Operate",
|
||||
Second = Pop(S): First = Pop(S)
|
||||
Push First + Second, S
|
||||
ELSEIF Token$ = "^" THEN
|
||||
PRINT "Operate",
|
||||
Second = Pop(S): First = Pop(S)
|
||||
Push First ^ Second, S
|
||||
ELSE
|
||||
PRINT "Push",
|
||||
Push VAL(Token$), S
|
||||
END IF
|
||||
PrintStack S
|
||||
LOOP UNTIL DP% = 0
|
||||
PRINT "Final answer: "; Pop(S)
|
||||
IF NOT Empty(S) THEN
|
||||
PRINT "Error, too many operands: ";
|
||||
PrintStack S
|
||||
STOP
|
||||
END IF
|
||||
END SUB
|
||||
|
||||
SUB MakeEmpty (S AS TNumStack)
|
||||
S.TopIndex = MAXINDEX + 1
|
||||
END SUB
|
||||
|
||||
FUNCTION Pop (S AS TNumStack)
|
||||
IF Empty%(S) THEN
|
||||
PRINT "The stack is empty."
|
||||
STOP
|
||||
ELSE
|
||||
Pop = S.Elems(S.TopIndex)
|
||||
S.TopIndex = S.TopIndex + 1
|
||||
END IF
|
||||
END FUNCTION
|
||||
|
||||
SUB PrintStack (S AS TNumStack)
|
||||
FOR Ptr% = S.TopIndex% TO MAXINDEX
|
||||
PRINT USING "######.###"; S.Elems(Ptr%);
|
||||
NEXT Ptr%
|
||||
PRINT
|
||||
END SUB
|
||||
|
||||
SUB Push (X AS SINGLE, S AS TNumStack)
|
||||
IF S.TopIndex = 0 THEN
|
||||
PRINT "The stack is full."
|
||||
STOP
|
||||
ELSE
|
||||
S.TopIndex = S.TopIndex - 1
|
||||
S.Elems(S.TopIndex) = X
|
||||
END IF
|
||||
END SUB
|
||||
Loading…
Add table
Add a link
Reference in a new issue