go语言实现stack

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);
    void **p;
    if (s->use == s->size) {
        p = (void **)realloc(s->s, s->size * 2);
        if (p == NULL)
            return -1;
        s->s = p;
        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) {
    assert(s != NULL);
    return s->use;
}

int stack_free(my_stack_t *s) {
    void *v; 
    if (s->do_free == NULL) {
        goto done;
    }   

    while ((v = stack_pop(s)) != NULL) {
        s->do_free(s);
    }   
done:
    free(s->s);
    return 0;
}


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

转载于:https://my.oschina.net/guonaihong/blog/413526

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值