generic queue
This commit is contained in:
		
							parent
							
								
									6fe973096e
								
							
						
					
					
						commit
						cd3878d698
					
				
					 3 changed files with 19 additions and 24 deletions
				
			
		|  | @ -1,37 +1,32 @@ | ||||||
| package queue | package queue | ||||||
| 
 | 
 | ||||||
| // "Generic" item. | type Queue[T any] interface { | ||||||
| // When type parameters will land this type became | 	Enqueue(T) | ||||||
| // type Item[T any] T | 	Dequeue() T | ||||||
| type Item interface{} |  | ||||||
| 
 |  | ||||||
| type Queue interface { |  | ||||||
| 	Enqueue(Item) |  | ||||||
| 	Dequeue() Item |  | ||||||
| 	Size() int | 	Size() int | ||||||
| 	IsEmpty() bool | 	IsEmpty() bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // We use linked list as internal data structure | // We use linked list as internal data structure | ||||||
| // to get O(1) speed for push and pop opeartions | // to get O(1) speed for push and pop opeartions | ||||||
| type node struct { | type node[Item any] struct { | ||||||
| 	item Item | 	item Item | ||||||
| 	next *node | 	next *node[Item] | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type queue struct { | type queue[OfType any] struct { | ||||||
| 	size int | 	size int | ||||||
| 	head *node | 	head *node[OfType] | ||||||
| 	tail *node | 	tail *node[OfType] | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewQueue() Queue { | func NewQueue[OfType any]() Queue[OfType] { | ||||||
| 	return &queue{} | 	return &queue[OfType]{} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (q *queue) Enqueue(item Item) { | func (q *queue[T]) Enqueue(item T) { | ||||||
| 	oldTail := q.tail | 	oldTail := q.tail | ||||||
| 	q.tail = &node{item: item, next: nil} | 	q.tail = &node[T]{item: item, next: nil} | ||||||
| 	if q.IsEmpty() { | 	if q.IsEmpty() { | ||||||
| 		q.head = q.tail | 		q.head = q.tail | ||||||
| 	} else { | 	} else { | ||||||
|  | @ -40,7 +35,7 @@ func (q *queue) Enqueue(item Item) { | ||||||
| 	q.size++ | 	q.size++ | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (q *queue) Dequeue() Item { | func (q *queue[T]) Dequeue() T { | ||||||
| 	first := q.head | 	first := q.head | ||||||
| 	q.head = q.head.next | 	q.head = q.head.next | ||||||
| 	if q.IsEmpty() { | 	if q.IsEmpty() { | ||||||
|  | @ -50,10 +45,10 @@ func (q *queue) Dequeue() Item { | ||||||
| 	return first.item | 	return first.item | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (q *queue) Size() int { | func (q *queue[T]) Size() int { | ||||||
| 	return q.size | 	return q.size | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (q *queue) IsEmpty() bool { | func (q *queue[T]) IsEmpty() bool { | ||||||
| 	return q.head == nil | 	return q.head == nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -6,13 +6,13 @@ import ( | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func TestSimple(t *testing.T) { | func TestSimple(t *testing.T) { | ||||||
| 	queue := NewQueue() | 	queue := NewQueue[int]() | ||||||
| 
 | 
 | ||||||
| 	queue.Enqueue(10) | 	queue.Enqueue(10) | ||||||
| 	queue.Enqueue(20) | 	queue.Enqueue(20) | ||||||
| 	queue.Enqueue(30) | 	queue.Enqueue(30) | ||||||
| 
 | 
 | ||||||
| 	first, second := queue.Dequeue().(int), queue.Dequeue().(int) | 	first, second := queue.Dequeue(), queue.Dequeue() | ||||||
| 
 | 
 | ||||||
| 	if first != 10 && second != 20 { | 	if first != 10 && second != 20 { | ||||||
| 		log.Fatal("wrong order") | 		log.Fatal("wrong order") | ||||||
|  | @ -20,7 +20,7 @@ func TestSimple(t *testing.T) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestSize(t *testing.T) { | func TestSize(t *testing.T) { | ||||||
| 	queue := NewQueue() | 	queue := NewQueue[int]() | ||||||
| 
 | 
 | ||||||
| 	if queue.Size() != 0 { | 	if queue.Size() != 0 { | ||||||
| 		log.Fatal("empty queue should have size 0") | 		log.Fatal("empty queue should have size 0") | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								go.mod
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
										
									
									
									
								
							|  | @ -1,3 +1,3 @@ | ||||||
| module github.com/fotonmoton/algorithms | module github.com/fotonmoton/algorithms | ||||||
| 
 | 
 | ||||||
| go 1.16 | go 1.18 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue