From 075df550745b18e737830e2d61e305a0660ef9a6 Mon Sep 17 00:00:00 2001 From: NorthCityChen <449293786@qq.com> Date: Sat, 2 Apr 2022 12:44:23 +0800 Subject: [PATCH] =?UTF-8?q?ADD:=20=E5=8F=8C=E7=AB=AF=E9=98=9F=E5=88=97?= =?UTF-8?q?=E3=80=81=E9=98=9F=E5=88=97=E3=80=81=E6=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.go | 33 +++++++++------ dequeue/dequeue.go | 102 +++++++++++++++++++++++++++++++++++++++++++++ queue/queue.go | 51 +++++++++++------------ stack/stack.go | 49 ++++++++++------------ 4 files changed, 170 insertions(+), 65 deletions(-) create mode 100644 dequeue/dequeue.go diff --git a/app.go b/app.go index 754446f..ac084b9 100644 --- a/app.go +++ b/app.go @@ -1,6 +1,6 @@ /* * @Author: NorthCity1984 - * @LastEditTime: 2022-04-01 21:47:35 + * @LastEditTime: 2022-04-02 12:42:40 * @Description: * @Website: https://grimoire.cn * Copyright (c) NorthCity1984 All rights reserved. @@ -8,20 +8,29 @@ package main import ( - "stl-go/queue" + "fmt" + "stl-go/dequeue" ) func main() { - // s := stack.Init[int]() - // s.Push(12) - // s.Push(13) - // fmt.Println(s.GetTop()) - // fmt.Println(s.Pop()) - // fmt.Println(s.Pop()) - // fmt.Println(s.Pop()) - q := queue.Init[int]() - q.Push(12) - q.Push(34) + q := dequeue.Init[int]() + q.LPush(12) + q.LPush(23) + q.LPush(34) + q.Clear() + q.LPush(34) + q.RPush(44) + fmt.Println(q.LPop()) + fmt.Println(q.LPop()) + fmt.Println(q.LPop()) + fmt.Println(q.LPop()) + // q := queue.Init[int]() + // q.Push(12) + // q.Push(23) + // q.Push(44) + // // q.IsEmpty() + // fmt.Println(q.Pop()) + // fmt.Println(q.Pop()) // fmt.Println(q.Pop()) // fmt.Println(q.Pop()) } diff --git a/dequeue/dequeue.go b/dequeue/dequeue.go new file mode 100644 index 0000000..7803348 --- /dev/null +++ b/dequeue/dequeue.go @@ -0,0 +1,102 @@ +/* + * @Author: NorthCity1984 + * @LastEditTime: 2022-04-02 12:39:15 + * @Description: + * @Website: https://grimoire.cn + * Copyright (c) NorthCity1984 All rights reserved. + */ +package dequeue + +type Number interface { + int | int64 | float32 | float64 +} + +// dequeue: Based on Double Linked List +type Dequeue[T Number] struct { + size int + leftHead *dequeueNode[T] + rightHead *dequeueNode[T] +} + +type dequeueNode[T Number] struct { + Val T + LPointer *dequeueNode[T] + RPointer *dequeueNode[T] +} + +func Init[T Number]() *Dequeue[T] { + return &Dequeue[T]{size: 0, leftHead: new(dequeueNode[T]), rightHead: new(dequeueNode[T])} +} + +func (q *Dequeue[T]) IsEmpty() bool { + return q.size == 0 +} + +func (q *Dequeue[T]) Size() int { + return q.size +} + +func (q *Dequeue[T]) LPush(val T) bool { + newNode := &dequeueNode[T]{Val: val, LPointer: new(dequeueNode[T]), RPointer: q.leftHead} + if q.IsEmpty() { + q.leftHead = newNode + q.rightHead = newNode + } + q.size++ + q.leftHead.LPointer = newNode + q.leftHead = newNode + return true +} + +func (q *Dequeue[T]) LPop() (T, bool) { + if q.IsEmpty() { + return 0, false + } + val := q.leftHead.Val + q.leftHead = q.leftHead.RPointer + q.size-- + return val, true +} + +func (q *Dequeue[T]) RPush(val T) bool { + newNode := &dequeueNode[T]{Val: val, LPointer: q.rightHead, RPointer: new(dequeueNode[T])} + if q.IsEmpty() { + q.leftHead = newNode + q.rightHead = newNode + } + q.size++ + q.rightHead.RPointer = newNode + q.rightHead = newNode + return true +} + +func (q *Dequeue[T]) RPop() (T, bool) { + if q.IsEmpty() { + return 0, false + } + val := q.rightHead.Val + q.rightHead = q.rightHead.LPointer + q.size-- + return val, true +} + +func (q *Dequeue[T]) LNode() (T, bool) { + if q.IsEmpty() { + return 0, false + } + return q.leftHead.Val, true +} + +func (q *Dequeue[T]) RNode() (T, bool) { + if q.IsEmpty() { + return 0, false + } + return q.rightHead.Val, true +} + +func (q *Dequeue[T]) Clear() bool { + for !q.IsEmpty() { + q.RPop() + } + return q.IsEmpty() +} diff --git a/queue/queue.go b/queue/queue.go index 68b3148..d524233 100644 --- a/queue/queue.go +++ b/queue/queue.go @@ -1,50 +1,47 @@ /* * @Author: NorthCity1984 - * @LastEditTime: 2022-04-01 21:46:15 + * @LastEditTime: 2022-04-02 12:40:51 * @Description: * @Website: https://grimoire.cn * Copyright (c) NorthCity1984 All rights reserved. */ package queue +import "stl-go/dequeue" + type Number interface { int | int64 | float32 | float64 } -type Queue[T Number] struct { - size int - front *QueueNode[T] - end *QueueNode[T] +// queue: Based on dequeue +type queue[T Number] struct { + content *dequeue.Dequeue[T] } -type QueueNode[T Number] struct { - Val T - Next *QueueNode[T] +func Init[T Number]() *queue[T] { + return &queue[T]{content: dequeue.Init[T]()} } -func Init[T Number]() Queue[T] { - return Queue[T]{size: 0, front: nil, end: nil} +func (q *queue[T]) Push(val T) bool { + return q.content.RPush(val) } -func (q *Queue[T]) IsEmpty() bool { - return q.size == 0 +func (q *queue[T]) Pop() (T, bool) { + return q.content.LPop() } -func (q *Queue[T]) Push(val T) bool { - newNode := QueueNode[T]{Val: val, Next: nil} - q.size++ - q.end.Next = &newNode - q.end = &newNode - return true +func (q *queue[T]) IsEmpty() bool { + return q.content.IsEmpty() } -func (q *Queue[T]) GetFront() T { return q.front.Val } - -func (q *Queue[T]) Pop() (T, bool) { - if q.IsEmpty() { - return 0, false - } - retVal := q.front.Val - q.front = q.front.Next - return retVal, true +func (q *queue[T]) Size() int { + return q.Size() +} + +func (q *queue[T]) Clear() bool { + return q.content.Clear() +} + +func (q *queue[T]) Front() (T, bool) { + return q.content.LNode() } diff --git a/stack/stack.go b/stack/stack.go index de8118f..7c766c5 100644 --- a/stack/stack.go +++ b/stack/stack.go @@ -1,49 +1,46 @@ /* * @Author: NorthCity1984 - * @LastEditTime: 2022-04-01 21:35:59 + * @LastEditTime: 2022-04-02 12:39:53 * @Description: * @Website: https://grimoire.cn * Copyright (c) NorthCity1984 All rights reserved. */ package stack +import "stl-go/dequeue" + type Number interface { int | int64 | float32 | float64 } -type Stack[T Number] struct { - size T - top *stackItem[T] +type stack[T Number] struct { + content *dequeue.Dequeue[T] } -type stackItem[T Number] struct { - Val T - Next *stackItem[T] +func Init[T Number]() *stack[T] { + return &stack[T]{content: dequeue.Init[T]()} } -func Init[T Number]() Stack[T] { - return Stack[T]{size: 0, top: nil} +func (s *stack[T]) IsEmpty() bool { + return s.content.IsEmpty() } -func (s *Stack[T]) IsEmpty() bool { return s.size == 0 } - -func (s *Stack[T]) Push(val T) bool { - newNode := stackItem[T]{Val: val, Next: s.top} - s.size++ - s.top = &newNode - return true +func (s *stack[T]) Size() int { + return s.content.Size() } -func (s *Stack[T]) GetTop() T { - return s.top.Val +func (s *stack[T]) Push(val T) bool { + return s.content.LPush(val) } -func (s *Stack[T]) Pop() (T, bool) { - if s.IsEmpty() { - return 0, false - } - retVal := s.top.Val - s.size-- - s.top = s.top.Next - return retVal, true +func (s *stack[T]) Pop() (T, bool) { + return s.content.LPop() +} + +func (s *stack[T]) Top() (T, bool) { + return s.content.LNode() +} + +func (s *stack[T]) Clear() bool { + return s.content.Clear() }