Skip to content

Instantly share code, notes, and snippets.

@aimless
Last active August 29, 2015 14:20
Show Gist options
  • Save aimless/44f1440ee00f33c7a33a to your computer and use it in GitHub Desktop.
Save aimless/44f1440ee00f33c7a33a to your computer and use it in GitHub Desktop.
import strutils
import sequtils
type
Node[T] = object
Item: T
Next: ref Node[T]
Stack[T] = object
Top: ref Node[T]
Size: int
ElemKind = enum
Number,
Operator
Elem = object
case Kind: ElemKind
of Number: value: int
of Operator: optype: char
proc Size[T](stack: Stack[T]): int =
return stack.Size
proc Push[T](stack: var Stack[T], i: T) =
var n = new(Node[T])
n.Item = i
n.Next = stack.Top
stack.Top = n
stack.Size = stack.Size + 1
proc Pop[T](stack: var Stack[T]): T =
result = stack.Top.Item
stack.Top = stack.Top.Next
stack.Size = stack.Size - 1
proc `--` (front: seq[Elem], i: int): seq[Elem] = concat(front,@[Elem(Kind: Number, value: i)])
proc `--` (front: seq[Elem], c: char): seq[Elem] = concat(front,@[Elem(Kind: Operator, optype: c)])
var prog = @[] -- 3 -- 3 -- '+' -- 7 -- '*'
var stack = Stack[int]()
for i in prog:
case i.Kind
of Number:
stack.Push(i.value)
of Operator:
case i.optype
of '+':
stack.Push(stack.Pop() + stack.Pop())
of '*':
stack.Push(stack.Pop() * stack.Pop())
else:
stdout.writeln("UH OH")
stdout.writeln(stack.Pop())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment