Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "fmt"
- "strings"
- "unicode"
- "strconv"
- "math"
- "github.com/Ubiquest/lightstack"
- )
- const floatResolution int = 5
- func rpncalc(input string) float64 {
- if input == "" {
- return 0.0
- }
- stack := new(lightstack.Stack)
- var varMap map[string]float64
- varMap = make(map[string]float64)
- args := strings.Split(input, " ")
- for _, element := range args {
- if(unicode.IsDigit(rune(element[0]))) {
- val, _ := strconv.ParseFloat(element, floatResolution)
- stack.Push(val)
- } else if element[0] == '$' {
- val := varMap[element]
- stack.Push(val)
- } else if element[0] == '@' {
- stack.Push(element[1:len(element)])
- } else {
- equ := 0.0
- if element == "set" {
- lval, _ := stack.Pop().(string)
- rval, _ := stack.Pop().(float64)
- varMap["$" + lval] = rval
- } else if element == "+" {
- equ = stack.Pop().(float64) + stack.Pop().(float64)
- } else if element == "-" {
- lval, _ := stack.Pop().(float64)
- rval, _ := stack.Pop().(float64)
- equ = rval - lval
- } else if element == "*" {
- equ = stack.Pop().(float64) * stack.Pop().(float64)
- } else if element == "/" {
- lval, _ := stack.Pop().(float64)
- rval, _ := stack.Pop().(float64)
- equ = rval / lval
- } else if element == "%" {
- lval, _ := stack.Pop().(float64)
- rval, _ := stack.Pop().(float64)
- equ = float64(int(rval) % int(lval))
- } else if element == "^" {
- lval, _ := stack.Pop().(float64)
- rval, _ := stack.Pop().(float64)
- equ = math.Pow(rval, lval)
- } else if element == "sqrt" {
- lval, _ := stack.Pop().(float64)
- equ = math.Sqrt(lval)
- } else if element == "neg" {
- equ = -(stack.Pop().(float64))
- }
- stack.Push(equ)
- }
- }
- return stack.Top().(float64)
- }
- func main() {
- fmt.Println(rpncalc("4 @var1 set $var1 sqrt 25 + 9 / 3 3 -"))
- }
Advertisement
Add Comment
Please, Sign In to add comment