evaluator
This commit is contained in:
		
							parent
							
								
									a35bb36872
								
							
						
					
					
						commit
						d436ced2d6
					
				
					 2 changed files with 77 additions and 0 deletions
				
			
		
							
								
								
									
										47
									
								
								fundamentals/math_evaluator/evaluator.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								fundamentals/math_evaluator/evaluator.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | |||
| package mathevaluator | ||||
| 
 | ||||
| import ( | ||||
| 	"math" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/fotonmoton/algorithms/fundamentals/stack" | ||||
| ) | ||||
| 
 | ||||
| // Dijkstra's two stack algorithm for equation evaluation | ||||
| func Evaluate(exression string) int { | ||||
| 	operations := stack.NewStack() | ||||
| 	values := stack.NewStack() | ||||
| 
 | ||||
| 	for _, part := range strings.Split(exression, " ") { | ||||
| 		isOperation := part == "+" || part == "-" || part == "*" || part == "/" || part == "sqrt" | ||||
| 
 | ||||
| 		if part == "(" { | ||||
| 			continue | ||||
| 		} else if part == ")" { | ||||
| 			lastOperation := operations.Pop() | ||||
| 			lastValue := values.Pop().(int) | ||||
| 
 | ||||
| 			switch lastOperation { | ||||
| 			case "+": | ||||
| 				lastValue = values.Pop().(int) + lastValue | ||||
| 			case "-": | ||||
| 				lastValue = values.Pop().(int) - lastValue | ||||
| 			case "*": | ||||
| 				lastValue = values.Pop().(int) * lastValue | ||||
| 			case "/": | ||||
| 				lastValue = values.Pop().(int) / lastValue | ||||
| 			case "sqrt": | ||||
| 				lastValue = int(math.Sqrt(float64(lastValue))) | ||||
| 			} | ||||
| 			values.Push(lastValue) | ||||
| 		} else if isOperation { | ||||
| 			operations.Push(part) | ||||
| 		} else { | ||||
| 			newValue, _ := strconv.Atoi(part) | ||||
| 			values.Push(newValue) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return values.Pop().(int) | ||||
| } | ||||
							
								
								
									
										30
									
								
								fundamentals/math_evaluator/evaluator_test.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								fundamentals/math_evaluator/evaluator_test.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | |||
| package mathevaluator | ||||
| 
 | ||||
| import ( | ||||
| 	"log" | ||||
| 	"testing" | ||||
| ) | ||||
| 
 | ||||
| func TestSimple(t *testing.T) { | ||||
| 	result := Evaluate("( 1 + 1 )") | ||||
| 
 | ||||
| 	if result != 2 { | ||||
| 		log.Fatalf("wrong answer: %v", result) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestSqrt(t *testing.T) { | ||||
| 	result := Evaluate("sqrt ( 9 )") | ||||
| 
 | ||||
| 	if result != 3 { | ||||
| 		log.Fatalf("wrong answer: %v", result) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestComplex(t *testing.T) { | ||||
| 	result := Evaluate("( ( 1 + ( 2 - ( 3 * ( 4 / ( 1 + 1 ) ) ) ) ) + sqrt ( 9 ) )") | ||||
| 
 | ||||
| 	if result != 0 { | ||||
| 		log.Fatalf("wrong answer: %v", result) | ||||
| 	} | ||||
| } | ||||
		Loading…
	
	Add table
		
		Reference in a new issue