init
This commit is contained in:
		
						commit
						6f9dc7b91b
					
				
					 3 changed files with 87 additions and 0 deletions
				
			
		
							
								
								
									
										50
									
								
								fundamentals/stack/stack.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								fundamentals/stack/stack.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,50 @@ | |||
| package stack | ||||
| 
 | ||||
| // "Generic" item. | ||||
| // When type parameters will land this type became | ||||
| // type Item[T any] T | ||||
| type Item interface{} | ||||
| 
 | ||||
| type Stack interface { | ||||
| 	Push(Item) | ||||
| 	Pop() Item | ||||
| 	Size() int | ||||
| 	IsEmpty() bool | ||||
| } | ||||
| 
 | ||||
| // We use linked list as internal data structure | ||||
| // to get O(1) speed for push and pop opeartions | ||||
| type node struct { | ||||
| 	item Item | ||||
| 	next *node | ||||
| } | ||||
| 
 | ||||
| type stack struct { | ||||
| 	size int | ||||
| 	head *node | ||||
| } | ||||
| 
 | ||||
| func NewStack() Stack { | ||||
| 	return &stack{} | ||||
| } | ||||
| 
 | ||||
| func (s *stack) Push(item Item) { | ||||
| 	next := s.head | ||||
| 	s.head = &node{item, next} | ||||
| 	s.size++ | ||||
| } | ||||
| 
 | ||||
| func (s *stack) Pop() Item { | ||||
| 	head := s.head | ||||
| 	s.head = head.next | ||||
| 	s.size-- | ||||
| 	return head.item | ||||
| } | ||||
| 
 | ||||
| func (s *stack) Size() int { | ||||
| 	return s.size | ||||
| } | ||||
| 
 | ||||
| func (s *stack) IsEmpty() bool { | ||||
| 	return s.size == 0 | ||||
| } | ||||
							
								
								
									
										34
									
								
								fundamentals/stack/stack_test.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								fundamentals/stack/stack_test.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | |||
| package stack | ||||
| 
 | ||||
| import ( | ||||
| 	"log" | ||||
| 	"testing" | ||||
| ) | ||||
| 
 | ||||
| func TestSimple(t *testing.T) { | ||||
| 	stack := NewStack() | ||||
| 
 | ||||
| 	stack.Push(1) | ||||
| 	stack.Push(2) | ||||
| 
 | ||||
| 	if stack.Pop().(int) != 2 { | ||||
| 		log.Fatal("wrong stack value") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestSize(t *testing.T) { | ||||
| 	stack := NewStack() | ||||
| 
 | ||||
| 	if !stack.IsEmpty() { | ||||
| 		log.Fatal("should be empty") | ||||
| 	} | ||||
| 
 | ||||
| 	stack.Push(1) | ||||
| 	stack.Push(2) | ||||
| 	stack.Push(3) | ||||
| 
 | ||||
| 	if stack.Size() != 3 { | ||||
| 		log.Fatal("wrong size") | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										3
									
								
								go.mod
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								go.mod
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| module github.com/fotonmoton/algorithms | ||||
| 
 | ||||
| go 1.16 | ||||
		Loading…
	
	Add table
		
		Reference in a new issue