Go语言中文网 为您找到相关结果 36

【golang】用container/list实现栈(Stack)

go语言中的container有heap、list、ring,没有stack。 其中heap是优先级队列,虽然有Push()/Pop()接口,但是使用heap要实现heap.Interface接口,不够简洁。 所以这里用list封装了一个简单的stack,留作他用。 1 package stack 2 3 import "container/list" 4 5 type Stack struct { 6 list *list.List 7 } 8 9 func NewStack() *Stack { 10 list := list.New() 11 return &Stack{list} 12 } 13 14 func (stack *Stack) Push(value interface{...阅读全文

博文 2014-10-04 19:26:10 chinabrle

通用链式栈代码

```go import "errors" var ( // ErrEmpty 栈为空 ErrEmpty = errors.New("stack is empty") ) // StackNode 栈节点 type StackNode struct { el interface{} next *StackNode } // LinkStack 栈空间 type LinkStack struct { top *StackNode count int } // Push 入栈 func (l *LinkStack) Push(el interface{}) (err error) { s := StackNode{el: el, next: l.top} l.top = &s l.count++...阅读全文

博文 2019-07-16 10:09:59 daymenu

栈_逆波兰表达式_计算器实现_Golang版本

借助栈与逆波兰表达式 实现一个计算器,编程语言用的是Golang。 逆波兰表达式可以讲复杂的计算过程转化为简单的操作过程,进而得出答案。 比如 (a+b)*(b-c) 按照逆波兰表达式的规则得到 :ab+bc-* 然后将该表达式的字符以及符号,按照从左到右的顺序,依次入栈,一碰到符号则将栈顶前两个元素取出,做运算然后放入栈内,重复该操作,直到表达式结束。 下面将结合栈与逆波兰表达式写一个简易计算器。 运行命令如下 go run counter.go --expression=\(3-5\)*4-\(5*8\)/3+78*9 代码示例: package main import ( "fmt" "strconv" "flag" ) type StackNode struct { Data int...阅读全文

博文 2015-06-17 20:04:05 u012807459

Go 实现常见数据结构

1. [二叉搜索树](https://flaviocopes.com/golang-data-structure-binary-search-tree) 2. [字典](https://flaviocopes.com/golang-data-structure-dictionary) 3. [图](https://flaviocopes.com/golang-data-structure-graph) 4. [哈希表](https://flaviocopes.com/golang-data-structure-hashtable) 5. [链表](https://flaviocopes.com/golang-data-structure-linked-list) 6. [队列](h...阅读全文

分段栈技术

2012-11-30 分段栈技术 gcc中的splitstack技术原理 http://gcc.gnu.org/wiki/SplitStacks 分段栈的重要意义就在于,栈空间初始分配很小的大小,然后可以随便需要自动地增长栈空间.这样在多线程环境中就可以开千千万万个线程或协程而不至于耗尽内存. 基本实现 %gs寄存器存一个tcb结构的地址,go语言中是G这个结构体.这个结构中存了栈基址和stack_guard 对于使用分段栈的函数,每次进入函数后,前几条指令就是先检测%esp跟stack_guard比较,如果超了就要扩展栈空间 扩展栈 所有用于分配栈空间的函数本身不能使用分段栈.引入一个属性来控制函数的生成.当然,还要保证有足够的空间来调用分配函数。编译器在编译阶段加入特殊的标识.note....阅读全文

博文 2015-03-16 11:48:36 zenlife

Go1.3新特性 栈的全新实现—连续栈(1)

创文章,转载请注明出处:服务器非业余研究http://blog.csdn.net/erlib 作者Sunface 前言 在之前的Go1.3改动中提到过栈的实现从分段实现(segment stack)变为连续栈实现(Contiguous statck),这个改动不可谓不大,那会给我们带来什么影响呢?请参见下文 连续栈 给每个goroutine 都分配一块内存作为连续的栈,通过重新分配/复制来增长。 为什么需要连续栈 当前的栈分割技术有一个很大的问题:"hot split"(热分割)——如果栈快满的时候,一个额外的调用就会强制分配新的栈块(Stack chunk),当调用返回的时候,新分配的栈块就会被释放回收,这种情况下,如果同一个调用连续执行,过度的alloc/free会导致系统性能的显著降低...阅读全文

博文 2016-02-02 16:00:01 abv123456789

13.蛤蟆笔记go语言——并发调度器

13.蛤蟆笔记go语言——并发调度器 go支持创建成千上万并发任务. l 线程多路复用。 l 极小自定义初始栈。 l 任务在多个线程间切换。 三种抽象模型协作 如下图1: 系统限制,允许调整: 如下图2: 创建新并发任务。 如下图3: 创建系统线程执行任务。 如下图4 执行 如图5: 连续栈替代分段栈 如下图6...阅读全文

博文 2016-07-17 09:00:03 notbaron

golang随笔

break外层循环 func main() { FirstLoop: for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { fmt.Printf("i=%d, j=%d\r\n", i, j) if j == 5 { break FirstLoop } } } fmt.Println("the end") } range读取slice func main() { array := [3]int32{1, 2} aslice = array[0:2] for i, v := range aslice { fmt.Printf("[%d]=%d ", i, v) } } range读取map for key, value := range map...阅读全文

博文 2014-12-04 19:00:01 开开904

Go转型——数据结构初级(四)栈和队列

**1**.栈和队列 栈和队列是两种常用的线性结构,从数据结构角度来看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作实现性别操作的子集,他们是操作受限的线性表,因此也被称为限定的数据结构。但从数据类型角度来看,他们是和线性表大不相同。 **栈**:是限定仅在表尾进行插入或删除操作的线性表。对于栈来说,表尾一端有特殊含义,称为栈顶,相应的标头段称之为栈底。不含任何元素的栈被称作空栈。 假设S=(a(1),a(2),a(3),.......a(n)),我们称a(1)为栈底元素,a(n)为栈顶元素。进栈顺序应为a(1),a(2),a(3),.......a(n),退栈的顺序第一个元素应为栈顶元素。换句话说,栈的修改是按照后进先出的原则进行的,因此,栈又称之为后进先出线性表(简称LIFO结构)...阅读全文

博文 2018-01-24 17:04:03 yinshidaoshi

go语言学习记录2

defer :1 函数离开前执行2 FILO 栈package main import "fmt" func trace(s string) { fmt.Println("entering:", s); } func untrace(s string) { fmt.Println("leaving:", s); } func a() { trace("a"); defer untrace("a"); fmt.Println("in a") } func b() { trace("b"); defer untrace("b"); fmt.Println("in b"); a() } func trace2(s string) string { fmt.Println("entering:",s...阅读全文

博文 2015-12-23 01:00:10 lwj1396

Go语言用container/list实现栈(Stack)

go语言中的container有heap、list、ring,没有stack。 其中heap是优先级队列,虽然有Push()/Pop()接口,但是使用heap要实现heap.Interface接口,不够简洁。 所以这里用list封装了一个简单的stack,留作他用。 package stack import "container/list" type Stack struct { list *list.List } func NewStack() *Stack { list := list.New() return &Stack{list} } func (stack *Stack) Push(value interface{}) { stack.list.PushBack(value) }...阅读全文

博文 2016-11-05 03:00:00 lsj3210

数据结构之栈go言语实现

package main import ( "fmt" "os" ) type Node struct { val int pNode *Node } type Stack struct { pTop,pBottom *Node } func initStack(pStack *Stack){ pNew:=new(Node) pNew.pNode=nil pStack.pTop=pNew pStack.pBottom=pNew if pStack.pTop==nil || pStack.pBottom==nil { fmt.Println("分配头节点内存失败,程序退出") os.Exit(-1) } } func push(pStack *Stack,val int) { pNew:=ne...阅读全文

博文 2016-11-10 04:00:01 tangguangqiang

求教数据结构,golang实现出栈入栈覆盖第一个元素

**这个程序有问题,将元素入栈时,会覆盖第一个元素,最后栈中只留下一个2,求大神解答** ```go package main import ( "log" "fmt" ) type Stack struct { size int64 //栈的容量 top int64 //栈顶 data []interface{} } func MakeStack( size int64) Stack{ s :=Stack{} s.size=size s.data =make([]interface{},size) return s } //入栈,空间不足,逐段升高 func (s Stack) Push(e interface{}) bool{ if s.IsFull(){ log.Printf("栈满,...阅读全文

博文 2018-01-24 17:05:46 yinshidaoshi

Go的栈空间管理

栈空间管理的基本逻辑 go语言通过goroutine提供了并发编程支持,goroutine是go运行库的功能,而不是操作系统线程实现的,goroutine可以被理解成一个用户态的线程。 既然goroutine是由go运行库管理的,那么go运行库也需要为每个goroutine创建并管理相应的栈空间,为每个goroutine分配的栈空间不能太大,goroutine开多时会浪费大量空间,也不能太小,会导致栈溢出。go语言选择栈的栈空间管理的方式是,一开始给一个比较小的空间,随着需要自动增长。当goroutine不需要那么大的空间时,栈空间也要自动缩小。 分段栈 Segment Stacks 在go 1.3之前,go使用分段栈。 分段栈实现了一种不连续但是可以持续增长的栈,开始时,栈只有一个段,当需...阅读全文

博文 2018-10-11 19:34:39 simpleapples

golang用栈的方式从一段字符串中匹配出{}

一段字符串中匹配出{},感觉还是没有达到效果,仅仅是找出了括号,但是没有展示出那两个两两匹配 ```go package main import ( "fmt" "log" ) //从一段字符串中匹配出{} type Stack struct { size int64 //栈的容量 top int64 //栈顶 data []interface{} } func MakeStack( size int64) Stack{ s :=Stack{} s.size=size s.data =make([]interface{},size) return s } //入栈,空间不足,逐段升高 func (s *Stack) Push(e interface{}) bool{ if s.IsFull(...阅读全文

博文 2018-01-24 20:44:16 yinshidaoshi

LeetCode-最小栈

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) -- 将元素 x 推入栈中。 pop() -- 删除栈顶的元素。 top() -- 获取栈顶元素。 getMin() -- 检索栈中的最小元素。 示例: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2. 解法: 大概思路是使用维护两个栈,一个保存数据,一个保存最...阅读全文

博文 2019-04-13 13:34:38 xx19941215

(初级)8.最小栈

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) -- 将元素 x 推入栈中。 pop() -- 删除栈顶的元素。 top() -- 获取栈顶元素。 getMin() -- 检索栈中的最小元素。 示例: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2. 使用两个栈来实现,一个栈来按顺序存储push进来的数据,另...阅读全文

博文 2018-08-12 17:35:09 one_zheng

go的切片实现stack问题

日常刷题刷到一个要用到栈的问题,go没有内置stack就用切片实现了,然而效率低的过分,不知道是不是我不会用导致的,发给大家看看。 这是golang用时和代码: ![image.png](https://static.studygolang.com/180429/2eb27ace8260cab2f024385da75d63e9.png) 这是C艹用时: ![image.png](https://static.studygolang.com/180429/bb76f0eab74c890b09bb65433d04c679.png) C艹代码:


class Solution {
public:
    vector dailyTe...阅读全文

使用Golang实现栈的链式存储

栈就像一个水杯后进先出,栈的链式存储中后进去元素的next总是指向先进去的元素, 栈顶元素总是和最后一个进去的元素相同type Elem int// Node 元素节点结构type Node struct {data Elemnext *Node}// StackLink 栈type StackLink struct {top *Node // 栈顶元素length int}// InitStack 初始化一个栈,栈先进后出func (s *StackLink) InitStack() {s.top = nil}// Push 添加一个栈元素func (s *StackLink) Push(data Elem) {// 创造一个节点node := new(Node)node.data = d...阅读全文

博文 2017-10-23 04:04:50 萧末

go实现栈

本来写敏感词检测的代码,后面需求撤销了,留下一点可复用的代码怀念下 package stack // 不确定变量类型和结构,使用了interface type Stack struct { data []interface{} } func (s *Stack) Push (item interface{}) (string, bool) { s.data = append(s.data, item) return "ok", true } func (s *Stack) Pop () (interface{}, bool) { length := s.Length() var item interface{} if length == 0 { return item, false } el...阅读全文

博文 2019-05-17 19:34:37 lingying5

深入理解golang 的栈

线程栈(thread stacks)介绍 先回顾下linux的内存空间布局 简书_stack02.png 当启动一个C实现的thread时,C标准库会负责分配一块内存作为这个线程的栈。标准库分配这块内存,告诉内核它的位置并让内核处理这个线程 的执行。 在linux系统中,可通过 ulimit -s查看系统栈大小(8M)。 ulimit -s 10240可修改栈大小为10M。 简书_stack01.png 这里最大的一个问题是,分配大数组,或者循环递归函数时,默认的栈空间不够用,会导致Segmentation fault错误。 //testMaxStack.cpp #include int main() { printf("init ok\n"); char a[8192*...阅读全文

博文 2018-11-06 16:34:46 风再起时ME

Golang 数据结构之【4.4顺序栈】

由于 进栈和出栈没有涉及任何循环语句,因此时间复杂度均是 0(1) golang代码实现如下: package main //顺序栈 import ( "errors" "fmt" ) const MaxSize = 20 //存储空间初始分配量 type SElemType int // SElemType类型根据实际情况而定,这里假设为int type SqStack struct { data [MaxSize]SElemType //栈的数据容量,用数组实现。如果不确定最大值可以用slice类型,这里我选择用数组。 top int //栈顶指针 } // 初始化一个空栈 func (s *SqStack) InitStack () { s.top = -1 } // 把s置为空栈 f...阅读全文

博文 2019-05-16 16:34:43 JiBadBoy

Golang 数据结构之【4.5共享栈】

图片来源于《大话数据结构》 图片来源于《大话数据结构》 两栈共享空间的结构的golang代码如下: package stack import ( "fmt" "errors" ) //共享栈 const MaxDoubleSize = 20 //存储空间初始分配量 type DoubleStack struct { data [MaxDoubleSize]SElemType top1 int //栈1栈顶指针 top2 int //栈2栈顶指针 } // 初始化一个空栈 func (d *DoubleStack) InitStack () { d.top1 = -1 d.top2 = MaxDoubleSize } // 把d置为空栈 func (d *DoubleStack) ClearS...阅读全文

博文 2019-05-16 16:34:43 JiBadBoy

Golang 数据结构之【4.6链栈存储】

链栈的介绍 对于链钱来说,基本不存在栈满的情况,除非内存已经没有可以使用的空间,如 果真的发生,那时的计算机操作系统已经面临死机崩溃的情况,而不是这个栈是 否溢出的问题。 但对于空栈来说,链表原定义是头指针指向空 那么链栈的空其实就是 top=nil 的时候。 top 为栈顶指针 图片来源于《大话数据结构》 链栈的push操作 图片来源于《大话数据结构》 链栈的pop操作 图片来源于《大话数据结构》 go实现的代码如下: package main import ( "errors" "fmt" ) type SElemType int //节点数据类型 // 链栈节点结构 type LinkNode struct { data SElemType //节点数据 next *LinkNode ...阅读全文

博文 2019-05-16 14:34:48 JiBadBoy

[笔记]为什么不能在struct中存Contexts?

引用来自 golang team 成员 Sajmani 的 issues 回答 Yes, the impedance mismatch is primarily a concern for exported types. The scenario I'm worried about is: package foo defines type Context that contains a context.Context and, say, method Foo() *Foo, for accessing foo-specific data. package bar defines type Context that contains a context.Context and, say, me...阅读全文

博文 2019-04-10 01:34:43 yujie_7be3

一种通用递归深度检测技术 - 基于栈帧内容的检测 - Golang语言描述

背景 在递归处理的调用中,在具体的工程实践中一般会引入递归深度检测,防止因为错误的数据造成系统的资源极大的消耗,本方法定义了一种通用简单的递归检查方法。 步骤 实现函数RecursiveDepthChecker func RecursiveDepthChecker(max int) bool { //注意,这里我们跳过了本函数自己的栈,找到父调用的函数名 caller, _, _, _ := runtime.Caller(1) currentFuncName := runtime.FuncForPC(caller).Name() stack := make([]byte, 65535*1) //max 1MB stack traceback //由于Golang Runtime中很多关于栈的...阅读全文

博文 2019-03-02 15:34:42 imiskolee

Go的栈空间管理

栈空间管理的基本逻辑go语言通过goroutine提供了并发编程支持,goroutine是go运行库的功能,而不是操作系统线程实现的,goroutine可以被理解成一个用户态的线程。既然goroutine是由go运行库管理的,那么go运行库也需要为每个goroutine创建并管理相应的栈空间,为每个goroutine分配的栈空间不能太大,goroutine开多时会浪费大量空间,也不能太小,会导致栈溢出。go语言选择栈的栈空间管理的方式是,一开始给一个比较小的空间,随着需要自动增长。当goroutine不需要那么大的空间时,栈空间也要自动缩小。分段栈 Segment Stacks在go 1.3之前,go使用分段栈。分段栈实现了一种不连续但是可以持续增长的栈,开始时,栈只有一个段,当需要更多的栈...阅读全文

博文 2018-10-17 10:03:14 simpleapples

简化路径

思路一 使用栈来处理 遇到 ".." 出栈 遇到 "." 不处理 其它情况,进栈 最后拼接字符串 Leecode Golang 用时4ms内存占用4M func simplifyPath(path string) string { slice := make([]string, 0) pathArr := []rune(path) strLen := len(pathArr) m, n := 0, 0 var resString string for i, j := 0, 0; j < strLen; j++ { if i < j && (string(pathArr[j]) == "/" || j == strLen-1) { m, n = i, j if string(pathArr[i...阅读全文

博文 2019-03-01 19:34:41 hookover

golang中用链表实现栈

node通过prev字段进行关联,stack维护栈顶节点 stack.go package stack type Stack struct { top *node length int } type node struct { value interface{} prev *node } // 创建一个栈 func New() *Stack { return &Stack{nil, 0} } // 取栈长度 func (s *Stack) Len() int { return s.length } // 查看栈顶元素 func (s *Stack) Peek() interface{} { if s.length == 0 { return nil } return s.top.value ...阅读全文

博文 2019-07-12 20:33:39 ustb80

golang函数错误处理调用栈递归打印

package errh import ( "dog/util/log" "runtime" ) func Dao(err error) error { if err != nil { for i := 1; ; i++ { pc, file, line, ok := runtime.Caller(i) if !ok { break } f := runtime.FuncForPC(pc) if f.Name() != "runtime.main" && f.Name() != "runtime.goexit" { log.Error.Println("file:", file, "line:", line, "funcName:", f.Name(), "error:", err.Erro...阅读全文

博文 2019-03-21 14:34:48 不浪人

Golang数据结构 - 2 - 栈

栈 在上一部分中,我们用Go实现了最常用的数据结构-数组,并实现了数组的添加元素、删除元素、数组遍历、数组排序和数组查找等功能。 在数组中我们可以实现任意位置的添加或删除元素,但是在某些场景中,需要我们对数据的添加或删除进行进一步的限制,于是就有了栈和队列。本章将使用Go来实现栈和栈的一些基本功能。 栈是一种运算受限的线性表,对栈中数据进行操作的时候需要遵循后进先出(LIFO)原则。在栈中对元素进行入栈或出栈操作的一端叫作栈顶,另一端则为栈底。 本章中将基于Golang切片和链表两种实现方法来实现栈。 栈定义 首先定义栈接口,其中包含以下方法: Push(e ...Element):添加若干元素到栈顶 Pop() Element:弹出一个栈顶元素 Peek() Element:返回栈顶元素,...阅读全文

博文 2019-06-19 02:03:00 monigo

如何理解栈 栈其实十分好理解,后进者先出,先进者后出,就是典型的栈的结构。 2019-08-18 17-15-13屏幕截图.png 当一个数据只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,就应该选择“栈”这种数据结构。 如何实现一个栈 栈有 顺序栈 和 链式栈 。顺序栈是由数组实现的,而链式栈是由链表实现的。 有了实现方式还差栈的最常规操作,出栈和入栈。这里利用数组实现一个顺序栈。 顺序栈 一个最基础的顺序栈 实现(使用golang) type ArrayStack struct { Item []string // 数组 Cnt int // 栈中元素个数 n int // 栈的大小 } func (s *ArrayStack) InitStack(n int) { s.I...阅读全文

博文 2019-08-19 02:32:45 OOM_Killer