Skip to content

Instantly share code, notes, and snippets.

@sooop
Last active August 29, 2015 14:22
Show Gist options
  • Save sooop/09f1ffe26b1f45fd64ff to your computer and use it in GitHub Desktop.
Save sooop/09f1ffe26b1f45fd64ff to your computer and use it in GitHub Desktop.
Calcurator
import Foundation
func parseExpression(tokens:[String]) -> [String] {
let operators:[String:Int] = [
"*": 10,
"/": 10,
"+": 9,
"-": 9,
"(": 0,
")": 0
]
var output:Array<String> = []
var stack:Array<String> = []
for token in tokens {
switch token {
case ")":
while !stack.isEmpty {
let p = stack.removeLast()
if p == "(" {
break
} else {
output.append(p)
}
}
case "(":
stack.append(token)
default:
if contains(operators.keys, token) {
while !stack.isEmpty {
if operators[stack.last!]! >= operators[token]! {
output.append(stack.removeLast())
} else {
break
}
}
stack.append(token)
} else {
output.append(token)
}
}
}
while !stack.isEmpty {
output.append(stack.removeLast())
}
return output
}
func calculateTokens(var tokens:[String]) -> Double {
let operators:[String:(Double, Double) -> Double] = [
"*" : (*),
"/" : (/),
"+" : (+),
"-" : (-)
]
var stack:[Double] = []
func performOperation(operation:(Double, Double) -> Double) -> Double {
let rhs = stack.removeLast()
let lhs = stack.removeLast()
let result = operation(lhs, rhs)
stack.append(result)
return result
}
for token in tokens {
if !contains(operators.keys, token) {
if let number = NSNumberFormatter().numberFromString(token) {
stack.append(number.doubleValue)
}
}
else {
let r = performOperation(operators[token]!)
//println(r)
}
}
return stack.removeLast()
}
let e = split("( 1 + 2 ) * 3 - 2", isSeparator:{$0 == " "})
let r = parseExpression(e)
let rr = calculateTokens(r)
println(r)
println(rr)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment