ここでの問題は、CでコールスタックのAPIを設計することです。スタックにプッシュされるアイテムは、1バイトからNバイトの範囲のさまざまなサイズにすることができます(たとえば、それらを組み合わせてプッシュすることもできます。最初にchar、次にintをプッシュし、次にstructをプッシュします)。スタックは、リンクリストまたは動的配列として実装できます。制約はありません。
私の解決策:スタックにプッシュされるアイテムのデータ型が不明であるため、void*ポインターを使用することが適切な解決策である可能性があると考えました。
質問:これは、エンジニアリングの観点から、それを実装するための最良の方法ですか?より良いアプローチはありますか?以下の私のコードを見つけてください。ありがとう!
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct stack_node snode;
struct stack_node{
snode *next;
void *data;
};
bool push(snode **top, void* data)
{
snode *current = (snode*)malloc(sizeof(snode));
if(!current)
return false;
current->data = data;
current->next = *top;
*top = current;
return true;
}
bool pop(snode **top, void **data)
{
snode* current;
current = *top;
if(!current)
return false;
*data = current->data;
*top = current->next;
free(current);
return true;
}
int main()
{
int num=0, i;
snode* top = NULL;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for(i = 0; i < 10 ; i++ )
{
if(!push(&top, &arr[i]))
printf("error allocating memory\n");
}
void *data;
while(pop(&top, &data))
{
printf("popped %d\n", *((int*)data));
}
return 0;
}