0

int 配列と char 配列 (文字列) の両方を取り込むには、スタックが必要です。何かご意見は?現在、整数で動作する pop および push コマンドがあることを知っています。別のタイプの構造の方がうまく機能しますか? さまざまな議論を受け入れることができる特定の構造を思い出すようです。char配列を処理するために別の関数を定義すると役に立ちますか? cでオーバーロードできないことは知っています。私のもう1つの考えは、スタックに文字列を取り込ませ、必要に応じて文字列とintの間で変換することでしたが、それは2つの変数型の間で少し危険な定数の切り替えのようです.

typedef struct Stack
{
int capacity;       // max # of elements the stack can hold
int size;           // current size of the stack
int *elements;      // the array of elements
}Stack;

Stack * createStack(int maxElements)
{        

Stack *S;        
S = (Stack *)malloc(sizeof(Stack));     
S->elements = (int *)malloc(sizeof(int)*maxElements);        
S->size = 0;        
S->capacity = maxElements;      
return S;
}


// STACK COMMANDS


void pop(Stack *S)
{               
if(S->size==0)        
{                
    printf("Stack is Empty\n");                
return;        
}        

else        
{                
    S->size--;        
}        

return;
}

int top(Stack *S)
{        
if(S->size==0)        
{                
    printf("Stack is Empty\n");               
    exit(0);        
}               
return S->elements[S->size-1];
}

void push(Stack *S,int element)
{                
if(S->size == S->capacity)        
{                
    printf("Stack is Full\n");        
}        
else        
{                               
    S->elements[S->size++] = element;        
}        
return;
}
4

2 に答える 2

2

必要に応じてユニオンを使用できます。事実上、あなたが求めているのはバリアントデータ型です。だから私はそれを呼びますVariant

typedef enum VariantType {
    v_int,
    v_string
} EVariantType;

typedef struct Variant
{
    EVariantType type;
    union {
        int m_int;
        char * m_string;
    };
} SVariant;

記憶から、この匿名組合は大丈夫だと確信しています。つまり、整数を格納できます。

SVariant v;
v.type = v_int;
v.m_int = 42;

および文字列:

SVariant v;
v.type = v_string;
v.m_string = strdup( "Hello, World!" );

ここでは一般性のために列挙型を使用しました。これは、後で他の型に簡単に拡張できるためです (int か int でないかを示すフラグを使用するのではなく)。

もちろん、データを使用する場合は、switch ステートメントで処理できます。

switch( v.type )
{
    case v_int:  printf( "Integer value: %d\n", v.m_int ); break;
    case v_string: printf( "String value: %s\n", v.m_string ); break;
}

スタックは次のように宣言されます。

typedef struct Stack
{
    int capacity;       // max # of elements the stack can hold
    int size;           // current size of the stack
    SVariant *elements; // the array of elements
}Stack;

それが役立つことを願っています。

于 2012-10-25T00:48:46.587 に答える
0

ユニオンタイプを作成できます:

union mType
{
    int integer;
    char *string;
};

次に、 mType を要素の型にするだけです。

編集:

共用体は、. そして -> 演算子。でもメンバーそれぞれの思い出は重なっています。

于 2012-10-25T00:42:43.010 に答える