0

我需要我的堆栈来接收 int 和 char 数组(字符串)。有什么想法吗?我知道目前我有使用整数操作的 pop 和 push 命令。不同类型的结构会更好吗?我似乎记得某些结构能够接受不同的论点。如果我定义不同的函数来处理 char 数组会有帮助吗?我知道你不能在 c 中超载。我的另一个想法是让堆栈接收字符串并根据需要在字符串和 int 之间进行转换,但这似乎有点冒险在两种变量类型之间进行常量切换。

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 回答