2010-01-12 57 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

請張貼一些代碼。指針本身必須佔用固定數量的內存才能存儲,而不管它們指向什麼。 – 2010-01-12 22:57:57

+1

你是什麼意思的「最好」? – 2010-01-12 23:09:14

+0

基本上有兩種方法:1)使用增長數組,2)使用鏈表。什麼對你最好(或者是正確的)取決於你需要什麼。 – MAK 2010-01-14 21:57:41

回答

1

一種方法是使用數組作爲堆棧。跟蹤陣列容量。如果數組變滿,請分配一個新數組,將舊元素複製到新數組,然後刪除舊數組。

另一種選擇是使用鏈表作爲堆棧的基礎。這允許對每個新元素進行動態分配。

4

我認爲這個問題是您使用了錯誤的大小在您的來電。你不需要指針的大小 - 你想要指針本身的大小。

3

聽起來像你直接做

malloc(n * sizeof(void)) 

或間接地,你需要

malloc(n * sizeof(void*)) 
當然

真正的答案是的std ::堆棧(在C++)

+2

不,真正的答案是java.util.Stack(Java)。或者甚至更好,一個Lisp列表。 – 2010-01-12 23:23:07

+0

真正的答案是......練習! – 2010-01-12 23:26:21

+5

C++從來不是C語言問題的真正答案,除了「如果向C添加兩個加號,你會得到什麼?」 – Chuck 2010-01-12 23:44:54

1

我已經作爲前面問題的子集,回答了這個問題:

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

你必須稍微調整一下 - 用void *替換char *,將「addString」重命名爲「push」並編寫一個「pop」函數。哦,並且對malloc和realloc的調用添加錯誤檢查,這在回答中被省略了,因爲它在提問者的代碼中被省略了。

就像尼爾說的,雖然「最好」是非常主觀的。數組的增長只是實現堆棧的一種方式。根據使用模式以及您對代碼複雜性,速度和內存使用的要求,您可能需要一個鏈表,或者您可能需要類似於C++中std::deque類的混合列表/數組策略。

相關問題