Guest User

Untitled

a guest
May 16th, 2016
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.99 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.   "fmt"
  5.   "strings"
  6.   "unicode"
  7.   "strconv"
  8.   "math"
  9.   "github.com/Ubiquest/lightstack"
  10. )
  11.  
  12. const floatResolution int = 5
  13.  
  14. func rpncalc(input string) float64 {
  15.   if input == "" {
  16.     return 0.0
  17.   }
  18.   stack := new(lightstack.Stack)
  19.   var varMap map[string]float64
  20.   varMap = make(map[string]float64)
  21.   args := strings.Split(input, " ")
  22.  
  23.   for _, element := range args {
  24.     if(unicode.IsDigit(rune(element[0]))) {
  25.       val, _ := strconv.ParseFloat(element, floatResolution)
  26.       stack.Push(val)
  27.     } else if element[0] == '$' {
  28.       val := varMap[element]
  29.       stack.Push(val)
  30.     } else if element[0] == '@' {
  31.       stack.Push(element[1:len(element)])
  32.     } else {
  33.       equ := 0.0
  34.       if element == "set" {
  35.         lval, _ := stack.Pop().(string)
  36.         rval, _ := stack.Pop().(float64)
  37.         varMap["$" + lval] = rval
  38.       } else if element == "+" {
  39.         equ = stack.Pop().(float64) + stack.Pop().(float64)
  40.       } else if element == "-" {
  41.         lval, _ := stack.Pop().(float64)
  42.         rval, _ := stack.Pop().(float64)
  43.         equ = rval - lval
  44.       } else if element == "*" {
  45.         equ = stack.Pop().(float64) * stack.Pop().(float64)
  46.       } else if element == "/" {
  47.         lval, _ := stack.Pop().(float64)
  48.         rval, _ := stack.Pop().(float64)
  49.         equ = rval / lval
  50.       } else if element == "%" {
  51.         lval, _ := stack.Pop().(float64)
  52.         rval, _ := stack.Pop().(float64)
  53.         equ = float64(int(rval) % int(lval))
  54.       } else if element == "^" {
  55.         lval, _ := stack.Pop().(float64)
  56.         rval, _ := stack.Pop().(float64)
  57.         equ = math.Pow(rval, lval)
  58.       } else if element == "sqrt" {
  59.         lval, _ := stack.Pop().(float64)
  60.         equ = math.Sqrt(lval)
  61.       } else if element == "neg" {
  62.         equ = -(stack.Pop().(float64))
  63.       }
  64.       stack.Push(equ)
  65.     }
  66.   }
  67.   return stack.Top().(float64)
  68. }
  69.  
  70. func main() {
  71.   fmt.Println(rpncalc("4 @var1 set $var1 sqrt 25 + 9 / 3 3 -"))
  72. }
Advertisement
Add Comment
Please, Sign In to add comment