2010-01-12 3 views
2

무엇이 가장 좋음 C에서 동적 크기 조정 스택을 구현하는 방법은 무엇입니까?C에서 동적 크기 조정 스택을 구현하는 가장 좋은 방법은 무엇입니까?

예를 들어, 내가 스택에 메모리의 양을 할당하고 싶지만 그 스택이 가득 차면 때, 두 배로 할당 된 메모리 등,

내가 스택 사용 분에 구현 한 새로운 데이터를 수용하기 위해 void 포인터의 간단한 배열,이 방법은 모든 유형의 포인터를 저장할 수 있으므로 재사용이 가능합니다. malloc()/realloc()을 사용하여 구현하려고하면 크기가 지정되지 않은 void 포인터로 인해 포인터 계산을하는 동안 오류가 발생합니다.

무엇이 가장 좋음 C에서 동적으로 크기를 조정할 수있는 스택을 구현하는 방법은 무엇입니까?

편집 :

가이 코드 같은 것을 시도하고 있었다 (오류가 제거 검사)하지만 난 지금은이 같은 무효 포인터와 상호 작용 할 수 있음을 이해합니다. 그래서 나는 이처럼 합법적으로 어떻게 할 것인가를 생각하고 있습니다. 이것은 내가 C에 실제로 노출 된 적이 없기 때문에 나를위한 커다란 학습 과제입니다.

#include <stdio.h> 
#include <stdlib.h> 

#include "stack.h" 

static int index = 0; 

void* CreateStack(void) 
{ 
    void *stack = malloc(INITIAL_STACK_SIZE); 
    return stack; 
} 

void* Pop(void *stack) 
{ 
    return stack + index--; 
} 

void Push(void *stack, void *value) 
{ 
    *(stack + index) = value; 
} 

void FreeStack(void *stack) 
{ 
    free(stack); 
} 
+9

일부 코드는 게시하십시오. 포인터 자체가 가리키는 내용에 관계없이 포인터 자체는 고정 된 양의 메모리를 사용해야합니다. –

+1

"최고"는 무엇을 의미합니까? –

+0

기본적으로 두 가지 방법이 있습니다. 1) 성장하는 배열을 사용하고, 2) 연결된 목록을 사용합니다. 무엇이 가장 잘 작동하는지 (또는 올바른지) 필요한 부분에 달려 있습니다. – MAK

답변

1

한 가지 방법은 스택에 배열을 사용하는 것입니다. 어레이 용량을 추적하십시오. 배열이 꽉 차면 새 배열을 할당하고 이전 요소를 새 배열에 복사 한 다음 이전 배열을 삭제합니다.

또 다른 옵션은 링크 된 목록을 스택의 기초로 사용하는 것입니다. 이렇게하면 모든 새 요소에 동적 할당이 가능합니다. 직접

malloc(n * sizeof(void)) 

을하고있는 것처럼

4

나는 당신의 호출에서 잘못된 크기를 사용하고 있다고 생각합니다. pointee의 크기는 원하지 않습니다. 포인터 자체의 크기가 필요합니다.

3

소리 또는 간접적으로, 당신은 진짜 대답은 표준이다 :: 스택 내가했습니다

+2

Nah, "진짜"대답은 java.util.Stack (Java)입니다. 또는 더 나은, 리스프 목록. –

+0

진짜 대답은 ... 연습입니다! –

+5

C++는 "C에 두 개의 더하기 기호를 추가하면 어떻게됩니까?"라는 질문 이외에 C 질문에 대한 실제 대답이 결코 아닙니다. – Chuck

1

(C++에서) 물론

malloc(n * sizeof(void*)) 

필요 이전 질문의 하위 집합으로이 질문에 대답했습니다.

https://stackoverflow.com/questions/2006726/which-would-you-prefer-to-have-to-maintain/2007647#2007647

당신은 약간을 적응시켜야합니다 - char *를 void *로 바꾸고 "addString"의 이름을 "push"로 바꾸고 "pop"함수를 작성하십시오. 아, 그리고 malloc과 realloc에 ​​대한 호출에 오류 검사를 추가하십시오.이 검사는 질문자 코드에서 생략 되었기 때문에 생략되었습니다.

Neil이 말했듯이 "최고"는 매우 주관적이지만. 늘어나는 배열은 스택을 구현하는 한 가지 방법 일뿐입니다. 사용 패턴과 코드 복잡성, 속도 및 메모리 사용에 대한 요구 사항에 따라 링크 된 목록이 필요할 수도 있고 C++의 std::deque 클래스와 비슷한 하이브리드 목록/배열 전략이 필요할 수도 있습니다.

0

Dave Hanson's codeC Interfaces and Implementations을 사용하십시오. 훌륭한 책입니다. 동적 배열 트릭을 수행하는 방법을 알 수 있습니다. 우아하고 효율적이며 고도로 재사용 가능합니다!이 코드는 무료로 다운로드 할 수 있습니다.

관련 문제