Guest User

Untitled

a guest
Jun 19th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.67 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "math"
  6. )
  7.  
  8. func main() {
  9. engine := NewRPMEngine()
  10. engine.Push(2)
  11. engine.Push(3)
  12. engine.Compute("+")
  13. engine.Compute("^2")
  14. engine.Compute("SQRT")
  15. fmt.Println("Result", engine.Pop())
  16. }
  17.  
  18. // RPMEngine is the engine for a RPN calculator
  19. type RPMEngine struct {
  20. stack stack
  21. }
  22.  
  23. // NewRPMEngine returns a RPMEngine
  24. func NewRPMEngine() *RPMEngine {
  25. return &RPMEngine{
  26. stack: make(stack, 0),
  27. }
  28. }
  29.  
  30. // Push a value to the internal stack
  31. func (e *RPMEngine) Push(v int) {
  32. e.stack = e.stack.Push(v)
  33. }
  34.  
  35. // Pop a value from the internal stack
  36. func (e *RPMEngine) Pop() int {
  37. var v int
  38. e.stack, v = e.stack.Pop()
  39. return v
  40. }
  41.  
  42. // Compute an operation
  43. // If the operation results in a value, push it onto the stack
  44. func (e *RPMEngine) Compute(operation string) error {
  45. switch operation {
  46. case "+":
  47. e.addTwoNumbers()
  48. case "-":
  49. e.subtractTwoNumbers()
  50. case "*":
  51. e.multiplyTwoNumbers()
  52. case "/":
  53. e.divideTwoNumbers()
  54. case "^2":
  55. e.pow2ANumber()
  56. case "SQRT":
  57. e.sqrtANumber()
  58. case "C":
  59. e.Pop()
  60. case "AC":
  61. e.stack = make(stack, 0)
  62. default:
  63. return fmt.Errorf("Operation %s not supported", operation)
  64. }
  65. return nil
  66. }
  67.  
  68. func (e *RPMEngine) addTwoNumbers() {
  69. op2 := e.Pop()
  70. op1 := e.Pop()
  71. e.Push(op1 + op2)
  72. }
  73.  
  74. func (e *RPMEngine) subtractTwoNumbers() {
  75. op2 := e.Pop()
  76. op1 := e.Pop()
  77. e.Push(op1 - op2)
  78. }
  79.  
  80. func (e *RPMEngine) multiplyTwoNumbers() {
  81. op2 := e.Pop()
  82. op1 := e.Pop()
  83. e.Push(op1 * op2)
  84. }
  85.  
  86. func (e *RPMEngine) divideTwoNumbers() {
  87. op2 := e.Pop()
  88. op1 := e.Pop()
  89. e.Push(op1 * op2)
  90. }
  91.  
  92. func (e *RPMEngine) pow2ANumber() {
  93. op1 := e.Pop()
  94. e.Push(op1 * op1)
  95. }
  96.  
  97. func (e *RPMEngine) sqrtANumber() {
  98. op1 := e.Pop()
  99. e.Push(int(math.Sqrt(float64(op1))))
  100. }
Add Comment
Please, Sign In to add comment