Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "fmt"
- "math"
- )
- func main() {
- engine := NewRPMEngine()
- engine.Push(2)
- engine.Push(3)
- engine.Compute("+")
- engine.Compute("^2")
- engine.Compute("SQRT")
- fmt.Println("Result", engine.Pop())
- }
- // RPMEngine is the engine for a RPN calculator
- type RPMEngine struct {
- stack stack
- }
- // NewRPMEngine returns a RPMEngine
- func NewRPMEngine() *RPMEngine {
- return &RPMEngine{
- stack: make(stack, 0),
- }
- }
- // Push a value to the internal stack
- func (e *RPMEngine) Push(v int) {
- e.stack = e.stack.Push(v)
- }
- // Pop a value from the internal stack
- func (e *RPMEngine) Pop() int {
- var v int
- e.stack, v = e.stack.Pop()
- return v
- }
- // Compute an operation
- // If the operation results in a value, push it onto the stack
- func (e *RPMEngine) Compute(operation string) error {
- switch operation {
- case "+":
- e.addTwoNumbers()
- case "-":
- e.subtractTwoNumbers()
- case "*":
- e.multiplyTwoNumbers()
- case "/":
- e.divideTwoNumbers()
- case "^2":
- e.pow2ANumber()
- case "SQRT":
- e.sqrtANumber()
- case "C":
- e.Pop()
- case "AC":
- e.stack = make(stack, 0)
- default:
- return fmt.Errorf("Operation %s not supported", operation)
- }
- return nil
- }
- func (e *RPMEngine) addTwoNumbers() {
- op2 := e.Pop()
- op1 := e.Pop()
- e.Push(op1 + op2)
- }
- func (e *RPMEngine) subtractTwoNumbers() {
- op2 := e.Pop()
- op1 := e.Pop()
- e.Push(op1 - op2)
- }
- func (e *RPMEngine) multiplyTwoNumbers() {
- op2 := e.Pop()
- op1 := e.Pop()
- e.Push(op1 * op2)
- }
- func (e *RPMEngine) divideTwoNumbers() {
- op2 := e.Pop()
- op1 := e.Pop()
- e.Push(op1 * op2)
- }
- func (e *RPMEngine) pow2ANumber() {
- op1 := e.Pop()
- e.Push(op1 * op1)
- }
- func (e *RPMEngine) sqrtANumber() {
- op1 := e.Pop()
- e.Push(int(math.Sqrt(float64(op1))))
- }
Add Comment
Please, Sign In to add comment