0

ここでの問題は、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;
}
4

1 に答える 1

0

データがスタックに存在すると想定されていない場合は、ポインターを使用することをお勧めします。スタックから4バイトを超えるデータを渡したい場合はどうなりますか?ポインタはそこに最適なオプションではありません。私の意見では、データをバイトごとにスタックに挿入する必要があります。つまり、これunsigned charも良い選択肢になるでしょう。

于 2012-10-21T18:26:28.800 に答える