我可以将字符串和int值压入堆栈吗?

时间:2012-10-25 00:39:51

标签: c string stack int

我需要我的堆栈来接受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;
}

2 个答案:

答案 0 :(得分: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;

希望有所帮助。

答案 1 :(得分:0)

您可以创建一个联合类型:

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

然后你可以让你的元素类型为mType。

编辑:

联合体与结构类似,因为它们具有可由数据元素访问的数据元素。和 - >运营商。但每个成员的记忆重叠。