我需要我的堆栈来接受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;
}
答案 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。
编辑:
联合体与结构类似,因为它们具有可由数据元素访问的数据元素。和 - >运营商。但每个成员的记忆重叠。