分享
  1. 首页
  2. 文章

go语言实现stack

guonaihong · · 4689 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

golang

package stack
import (
  "errors"
)
type Stack []interface{}
func(stack *Stack) Push(v interface{}) {
  *stack = append(*stack, v)
}
func(stack *Stack) Pop() (interface{}, error){
  if len(*stack) == 0 { 
    return nil, errors.New("stack empty")
  }  
  v := (*stack)[len(*stack) - 1]
  *stack = (*stack)[:len(*stack) - 1]
  return v, nil 
}
func(stack *Stack) Top() (interface{}, error) {
  if len(*stack) == 0 { 
    return nil, errors.New("stack empty")
  }  
  return (*stack)[len(*stack) - 1], nil 
}
func(stack *Stack) Len() int {
  return len(*stack)
}


同样的思路用c实现:

typedef struct my_stack_t my_stack_t;
struct my_stack_t {
  void **s; /* 元素为void *的数组 */
  int use;  /* 已存入的元素个数 */
  int size; /* 在内存中已分配的个数 */
  void (*do_free)(void *);
};
#define DEFAULT_N 100
int stack_init(my_stack_t *s, void (*do_free)()) {
  assert(s != NULL);
  s->s = (void **)malloc(sizeof(void *) * DEFAULT_N);
  s->use = 0;
  s->size = DEFAULT_N;
  s->do_free = do_free;
  return 0;
}
int stack_push(my_stack_t *s, void *v) {
  assert(s != NULL);
  char *p; 
  if (s->use == s->size) {
    p = realloc(s->s, s->size * 2); 
    if (p == NULL)
      return -1; 
    s->size *= 2;
  }  
  s->s[s->use++] = v;
  return 0;
}
void *stack_pop(my_stack_t *s) {
  assert(s != NULL);
  if (s->use == 0) {
    return NULL;
  }  
  return s->s[--s->use];
}
void *stack_top(my_stack_t *s) {
  assert(s != NULL);
  if (s->use == 0) {
    return NULL;
  }  
  return s->s[s->use - 1]; 
}
int stack_len(my_stack_t *s) {
  return s->use;
}
int stack_free(my_stack_t *s) {
  void *v;
  if (s->do_free == NULL) {
    return 0;
  }
  while ((v = stack_pop(s)) != NULL) {
    s->do_free(s);
  }
  return 0;
}


*golang里的interface{} 等同于c里的void *


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:guonaihong

查看原文:go语言实现stack

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
4689 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏