在 c 中与不同类型的对象堆栈

Sou*_*aji 5 c stack data-structures

我想设计一个可以包含不同类型(int、float、double 或 char)对象的堆栈。堆栈的类型取决于声明。这可以在模板的帮助下使用 C++ 轻松实现。我想知道如何在没有模板的 c 中完成它......?这是我所做的基本定义:

#define STACKSIZE 100
#define INT 1
#define FLOAT 2
#define CHAR 3

struct stackelement{
    int etype;
    union {
      int ival;
      float fval;
      char cval;  
    } element;
};
struct stack{
    int top;
    struct stackelement items[STACKSIZE];
};
Run Code Online (Sandbox Code Playgroud)

使用此定义如何声明具有特定类型的堆栈,以及如何实现推送和弹出操作?

5go*_*der 2

在这种简单的情况下,您可以使用一些宏魔法来伪造模板。例如,您可以将其放入文件中poly_stack.h

\n\n
/* No include guards here! */\n\n#define CONCAT_NAME_R(A, B, C) A ## B ## C\n#define CONCAT_NAME(A, T) CONCAT_NAME_R(A, _, T)\n\nstruct CONCAT_NAME(stack, VALUE_TYPE)\n{\n  VALUE_TYPE top;\n  VALUE_TYPE items[STACKSIZE];\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后使用

\n\n
#define VALUE_TYPE int\n#include poly_stack.h\n#undef VALUE_TYPE\n
Run Code Online (Sandbox Code Playgroud)\n\n

为了使其工作,您需要定义所有堆栈操作inline在头文件中定义所有堆栈操作。

\n\n

我不认为这是一个非常优雅的解决方案。当然,您始终可以使用以下工具来生成外部代码sedawk出于相同目的的工具来生成外部代码。

\n\n

最后,您可以使用运行时多态性并声明

\n\n
struct poly_stack\n{\n  void * top;\n  void * items[STACKSIZE];\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

但与 \xe2\x80\x9ctemplated\xe2\x80\x9d 解决方案相比,这在类型安全性和性能方面都较差。而且使用起来也不太方便。

\n