首页 > Go 分布式学习利器(11)-- Go语言通过单链表 实现队列

Go 分布式学习利器(11)-- Go语言通过单链表 实现队列

一个小实验,将之前学习的Go相关的语法做个总结。

包括:

  1. Go语言接口特性
  2. Go语言封装特性
  3. Go语言 变量,指针,函数 语法
  4. GO语言 条件和循环语句 的语法
  5. GO语言的测试程序

通过链表实现一个队列,元素在其中 拥有先进先出的特性。

简单实用。

package data_structureimport ("fmt""testing"
)/*队列的结构体,一个是数据,一个是指针
*/
type Queue struct{ data intNext *Queue
}var mq *Queue // 用作队列的头节点
var endMq *Queue // 用作队列尾节点的上一个节点,方便插入/*通过可变参数 : node ... int 来直接构造队列
*/
func (q *Queue)Create(node ... int) bool { if len(node) == 0{ return false}mq = new(Queue)mq.Next=nilendMq = mqfor _,n := range node{ newQueueNode := new(Queue)newQueueNode.data = n/*链表的头插法,可以用来构造栈*///newQueueNode.Next = mq.Next//mq.Next = newQueueNode/*链表的尾插法,可以用来构造队列*/endMq.Next = newQueueNodeendMq = newQueueNode}endMq.Next = nilreturn true
}/*向队列中添加元素
*/
func (q *Queue)Push(node int) { newQueueNode := new(Queue)newQueueNode.data = nodeendMq.Next = newQueueNodeendMq = newQueueNodeendMq.Next = nil
}/*队列判空
*/
func (q *Queue)IsEmpty() bool { if mq.Next != nil { return false} else { return  true}
}/*队列的大小
*/
func (q *Queue)Size() int { if mq.Next == nil{ return 0}l := 1var newQueue *QueuenewQueue = mq.Nextfor  newQueue.Next!= nil { l ++newQueue = newQueue.Next}return l
}/*从队列中弹出元素
*/
func (q *Queue)Pop() bool { if mq.Next != nil{ mq = mq.Nextreturn true}return false
}/*打印当前队列中的元素
*/
func (q *Queue)Print() { n := 1var newHead *QueuenewHead = mq.Nextfor newHead.Next != nil { fmt.Printf("node%d: %d
",n,newHead.data )n++newHead = newHead.Next}fmt.Printf("node%d: %d
",n,newHead.data )
}/*测试代码
*/
func TestQueue(t *testing.T) { var Q *QueueQ = new(Queue)t.Log("Create queue : 1,2,3")Q.Create(1,2,3)Q.Print()Q.Push(2)t.Log("Push 2")Q.Print()t.Log("Size ", Q.Size())t.Log("Pop ",Q.Pop())Q.Print()t.Log("Size ", Q.Size())
}

输出如下:

=== RUN   TestQueuequeue_test.go:104: Create queue : 1,2,3
node1: 1
node2: 2
node3: 3queue_test.go:109: Push 2
node1: 1
node2: 2
node3: 3
node4: 2queue_test.go:111: Size  4queue_test.go:113: Pop  true
node1: 2
node2: 3
node3: 2queue_test.go:116: Size  3
--- PASS: TestQueue (0.00s)
PASS

更多相关:

  • 这里给出一个简单的C++线程池包装类,该类具有的特点是: 1.线程池大小是固定的, 一创建后,就不具有伸缩特性. 一般建议是 CPU核心数的2倍或1倍. 2.简单但是很可靠. 3.资源占用极低. 在开启100个线程时, 4核CPU的占用率只有20%不到, 30个线程时, 占用7%以下.实践证明, 使用信号量和互斥锁进行多线程的同...

  • http://blog.csdn.net/wallwind/article/details/6858634 http://blog.csdn.net/chao_xun/article/details/8037420 http://blog.163.com/jackie_howe/blog/static/1994913472011114...

  • 使用队列实现栈的下列操作: push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空 队列的特点:先入先出 栈的特点:后入先出 即我们每次添加元素到队列时,想要达到栈的效果,则需要调整当前元素到队列头部 方法一:双队列 一个临时队列保存push进去的元素,将...

  • Queue除了前面介绍的实现外,还有一种双向的Queue实现Deque。这种队列允许在队列头和尾部进行入队出队操作,因此在功能上比Queue显然要更复杂。下图描述的是Deque的完整体系图。需要说明的是LinkedList也已经加入了Deque的一部分(LinkedList是从jdk1.2 开始就存在数据结构)。   Deque在Q...

  • 网络流量队列优先级相关知识点 Qdisc(quick disconnect)快速分离,断开;是一种排队规则,实现对流量的优先级管理.   涉及随机公平队列,令牌桶过滤器,分层令牌桶,FIFO, /*  *CopyRight (c) 2014-02-05 by Ruiy use to CopyLift!!!!  * */   ...

  • 师弟总结的已经很好了 或者: 原工程需要导出的函数: extern "C" __declspec(dllexport) void Func(); 现工程导入这个函数: extern "C" __declspec(dllimport) void Func();...

  • 有使用过JS的朋友,相信都知道function。JS中的function是可以在里面在定义一个作为内部使用的。有时为了控制作用域,或者这种小函数只在这个函数体内会使用,所以就不希望在外部在作额外的定义。那C#中有没有这样类似的方式呢?答案是有的。 在C#中要实现,需要用到的是委托和lambda表达式。对于lambda表达式,是可以实...