package  mainimport  ( "errors" "fmt" 
) func  main ( )  { stack1 :=  createQueue[ int ] ( ) err :=  stack1. push ( 1 ) if  err !=  nil  { return } stack1. push ( 2 ) stack1. push ( 3 ) stack1. push ( 4 ) stack1. push ( 5 ) popData1 :=  stack1. pop ( ) fmt. Printf ( "出队列元素%+v\n" ,  * popData1) popData2 :=  stack1. pop ( ) fmt. Printf ( "出队列元素%+v\n" ,  * popData2) stack1. push ( 6 ) stack1. push ( 7 ) stack1. push ( 8 ) stack1. push ( 9 ) stack1. pop ( ) err =  stack1. push ( 10 ) if  err !=  nil  { fmt. Printf ( err. Error ( )  +  "\n" ) } stack1. forEach ( ) 
} 
type  queue[ T int  |  string  |  map [ string ] string ]  struct  { data [ 6 ] Thead int tail int 
} func  createQueue[ T int  |  string  |  map [ string ] string ] ( )  * queue[ T]  { return  & queue[ T] { data:  [ 6 ] T{ } , } 
} func  ( s * queue[ T] )  push ( item T)  error  { if  len ( s. data) - 1  ==  s. tail { if  s. head ==  0  { return  errors. New ( "队列满!" ) } currentTail :=  s. tail -  s. headfor  i :=  0 ;  i <  currentTail;  i++  { s. data[ i]  =  s. data[ i+ s. head] } s. head =  0 s. tail =  currentTail} s. data[ s. tail]  =  items. tail++ return  nil 
} 
func  ( s * queue[ T] )  pop ( )  * T { if  s. head ==  s. tail { return  nil } res :=  & s. data[ s. head] s. head++ return  res
} func  ( s * queue[ T] )  forEach ( )  { fmt. Printf ( "遍历队列:\n" ) for  i :=  s. head;  i <  s. tail;  i++  { fmt. Printf ( "当前队列元素%+v\n" ,  s. data[ i] ) } 
} package  mainimport  ( "fmt" 
) func  main ( )  { stack1 :=  createQueue[ int ] ( 5 ) err :=  stack1. push ( 1 ) if  err !=  nil  { return } stack1. push ( 2 ) fmt. Printf ( "队列容量%+v\n" ,  cap ( stack1. data) ) stack1. push ( 3 ) stack1. push ( 4 ) stack1. push ( 5 ) popData1 :=  stack1. pop ( ) fmt. Printf ( "出队列元素%+v\n" ,  * popData1) popData2 :=  stack1. pop ( ) fmt. Printf ( "出队列元素%+v\n" ,  * popData2) stack1. forEach ( ) stack1. push ( 6 ) stack1. push ( 7 ) stack1. push ( 8 ) stack1. push ( 9 ) fmt. Printf ( "队列容量%+v\n" ,  cap ( stack1. data) ) popData3 :=  stack1. pop ( ) fmt. Printf ( "出队列元素%+v\n" ,  * popData3) err =  stack1. push ( 10 ) if  err !=  nil  { fmt. Printf ( err. Error ( )  +  "\n" ) } stack1. forEach ( ) 
} type  queue[ T int  |  string  |  map [ string ] string ]  struct  { data [ ] T
} func  createQueue[ T int  |  string  |  map [ string ] string ] ( len  int )  * queue[ T]  { return  & queue[ T] { data:  make ( [ ] T,  0 ,  len ) , } 
} func  ( s * queue[ T] )  push ( item T)  error  { s. data =  append ( s. data,  item) return  nil 
} 
func  ( s * queue[ T] )  pop ( )  * T { if  len ( s. data)  ==  0  { return  nil } res :=  & s. data[ 0 ] s. data =  s. data[ 1 : ] return  res
} func  ( s * queue[ T] )  forEach ( )  { fmt. Printf ( "遍历队列:\n" ) for  _ ,  datum :=  range  s. data { fmt. Printf ( "当前队列元素%+v\n" ,  datum) } } package  mainimport  ( "errors" "fmt" 
) func  main ( )  { linkedObj :=  getLinked[ int ] ( 5 ) err :=  linkedObj. headPush ( 6 ) if  err !=  nil  { fmt. Printf ( err. Error ( ) ) } err =  linkedObj. headPush ( 5 ) if  err !=  nil  { fmt. Printf ( err. Error ( ) ) } err =  linkedObj. headPush ( 4 ) if  err !=  nil  { fmt. Printf ( err. Error ( ) ) } err =  linkedObj. headPush ( 3 ) if  err !=  nil  { fmt. Printf ( err. Error ( ) ) } err =  linkedObj. headPush ( 2 ) if  err !=  nil  { fmt. Printf ( err. Error ( ) ) } err =  linkedObj. headPush ( 1 ) if  err !=  nil  { fmt. Printf ( err. Error ( ) ) } err =  linkedObj. headPush ( 0 ) if  err !=  nil  { fmt. Printf ( err. Error ( ) ) } item :=  linkedObj. tailPop ( ) fmt. Printf ( "弹出节点: %+v\n" ,  * item) item =  linkedObj. tailPop ( ) fmt. Printf ( "弹出节点: %+v\n" ,  * item) linkedObj. headForeach ( ) err =  linkedObj. headPush ( - 1 ) if  err !=  nil  { fmt. Printf ( err. Error ( ) ) } linkedObj. tailForeach ( ) 
} type  linked[ T int  |  string  |  map [ string ] string ]  struct  { head   * node[ T] length int limit  int 
} type  node[ T int  |  string  |  map [ string ] string ]  struct  { data * Tnext * node[ T] prev * node[ T] 
} func  getLinked[ T int  |  string  |  map [ string ] string ] ( limit int )  * linked[ T]  { return  & linked[ T] { head:    nil , length:  0 , limit:   limit, } 
} func  createNode[ T int  |  string  |  map [ string ] string ] ( data T)  * node[ T]  { return  & node[ T] { data:  & data, next:  nil , prev:  nil , } 
} 
func  ( l * linked[ T] )  headPush ( data T)  error  { if  l. length >=  l. limit { return  errors. New ( "当前队满\n" ) } newNode :=  createNode ( data) if  l. head ==  nil  { l. head =  newNodel. length++ newNode. next =  newNodenewNode. prev =  newNodereturn  nil } currentNode :=  l. headheadNodePos :=  l. headl. head =  newNodenewNode. next =  currentNodecurrentNode. prev =  newNodefor  { if  currentNode. next ==  headNodePos { break } currentNode =  currentNode. next} if  l. length >=  l. limit { currentNode. prev. next =  newNodenewNode. prev =  currentNode. prev}  else  { currentNode. next =  newNodenewNode. prev =  currentNodel. length++ } return  nil 
} 
func  ( l * linked[ T] )  tailPop ( )  * T { if  l. head ==  nil  { return  nil } currentNode :=  l. headheadNodePos :=  l. headfor  { if  currentNode. next ==  headNodePos { break } currentNode =  currentNode. next} currentNode. prev. next =  headNodePosheadNodePos. prev =  currentNode. prevl. length-- return  currentNode. data
} 
func  ( l * linked[ T] )  headForeach ( )  { headNode :=  l. headheadNodPos :=  headNodefmt. Printf ( "从头结点遍历:\n" ) for  { fmt. Printf ( "当前节点: %+v\n" ,  * headNode. data) if  headNode. next ==  headNodPos { break } headNode =  headNode. next} 
} 
func  ( l * linked[ T] )  tailForeach ( )  { endNode :=  l. headendNodePos :=  endNodefmt. Printf ( "从尾结点遍历:\n" ) for  { fmt. Printf ( "当前节点: %+v\n" ,  * endNode. prev. data) if  endNode. prev ==  endNodePos { break } endNode =  endNode. prev} 
} package  mainimport  ( "errors" "fmt" "sync" 
) func  main ( )  { linkedObj :=  getLinked[ int ] ( 5 ) syncGroup :=  sync. WaitGroup{ } syncGroup. Add ( 1050 ) for  i :=  0 ;  i <  1000 ;  i++  { i :=  igo  func ( )  { err :=  linkedObj. headPush ( i) if  err !=  nil  { fmt. Printf ( err. Error ( ) ) } syncGroup. Done ( ) } ( ) } for  i :=  0 ;  i <  50 ;  i++  { go  func ( )  { data :=  linkedObj. tailPop ( ) if  data !=  nil  { fmt. Println ( * data) } syncGroup. Done ( ) } ( ) } syncGroup. Wait ( ) linkedObj. headForeach ( ) 
} type  linked[ T int  |  string  |  map [ string ] string ]  struct  { head     * node[ T] length   int limit    int headLock sync. MutextailLock sync. Mutex
} type  node[ T int  |  string  |  map [ string ] string ]  struct  { data * Tnext * node[ T] prev * node[ T] 
} func  getLinked[ T int  |  string  |  map [ string ] string ] ( limit int )  * linked[ T]  { return  & linked[ T] { head:      nil , length:    0 , limit:     limit, headLock:  sync. Mutex{ } , tailLock:  sync. Mutex{ } , } 
} func  createNode[ T int  |  string  |  map [ string ] string ] ( data T)  * node[ T]  { return  & node[ T] { data:  & data, next:  nil , prev:  nil , } 
} 
func  ( l * linked[ T] )  headPush ( data T)  error  { l. headLock. Lock ( ) defer  l. headLock. Unlock ( ) if  l. length >=  l. limit { return  errors. New ( "当前队满\n" ) } newNode :=  createNode ( data) if  l. head ==  nil  { l. head =  newNodel. length++ newNode. next =  newNodenewNode. prev =  newNodereturn  nil } currentNode :=  l. headheadNodePos :=  l. headl. head =  newNodenewNode. next =  currentNodecurrentNode. prev =  newNodefor  { if  currentNode. next ==  headNodePos { break } currentNode =  currentNode. next} if  l. length >=  l. limit { currentNode. prev. next =  newNodenewNode. prev =  currentNode. prev}  else  { currentNode. next =  newNodenewNode. prev =  currentNodel. length++ } return  nil 
} 
func  ( l * linked[ T] )  tailPop ( )  * T { l. tailLock. Lock ( ) defer  l. tailLock. Unlock ( ) if  l. head ==  nil  { return  nil } currentNode :=  l. headheadNodePos :=  l. headfor  { if  currentNode. next ==  headNodePos { break } currentNode =  currentNode. next} if  currentNode ==  headNodePos { l. head =  nil }  else  { currentNode. prev. next =  headNodePosheadNodePos. prev =  currentNode. prev} l. length-- return  currentNode. data
} 
func  ( l * linked[ T] )  headForeach ( )  { if  l. head ==  nil  { fmt. Printf ( "队空:\n" ) return } headNode :=  l. headheadNodPos :=  headNodefmt. Printf ( "从头结点遍历:\n" ) for  { fmt. Printf ( "当前节点: %+v\n" ,  * headNode. data) if  headNode. next ==  headNodPos { break } headNode =  headNode. next} 
} 
func  ( l * linked[ T] )  tailForeach ( )  { if  l. head ==  nil  { fmt. Printf ( "队空:\n" ) return } endNode :=  l. headendNodePos :=  endNodefmt. Printf ( "从尾结点遍历:\n" ) for  { fmt. Printf ( "当前节点: %+v\n" ,  * endNode. prev. data) if  endNode. prev ==  endNodePos { break } endNode =  endNode. prev} 
}