go 언어 구현stack
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와 같다*
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.