如何通过函数指针实现堆栈以及如何使用它

How to Implement stack by function pointer and how to use it

我知道c中的struct只包含成员变量,没有任何声明函数。那正确吗?
我们是否在结构中使用函数指针而不是函数?

例如:
+ 作为 class

成员的 c++
class stack{
  int[10] data;
  int top;

public:                 
  void init();          
  bool isEmpty();           
  bool isFull();            
  void push(int ivalue);
  int pop();
}

+ 用 C,不能那样做。

    struct stack(
    int[10] data;
    int top;

    void int();     // wrong here
    ....
)

所以我们用函数指针实现栈吗?
请给我一个例子以及如何使用它?
感谢您的帮助!

不,不能在 C 结构中声明函数成员(仅在 C++ 中)。约定是在进行面向对象编程时将结构指针作为函数中的第一个参数传递。此外,C++ 确实做同样的事情,"this" 指针作为第一个参数传递,它只是被隐藏了。

struct stack{
  int[10] data;
  int top;
};

void stack_init(struct stack* stack);          
int stack_isEmpty(struct stack* stack);           
int stack_isFull(struct stack* stack);            
void stack_push(struct stack* stack, int ivalue);
int stack_pop(struct stack* stack);

下面这部分可能比您要求的要多,但是如果您希望函数更多 "dynamic",您可以将函数指针放在结构中以使其成为 "changeable",即模拟c++中的virtual关键字。

struct stack{
    int[10] data;
    int top;
    int (*isEmpty)(struct stack* stack);           
    int (*isFull)(struct stack* stack);            
    void (*push)(struct stack* stack, int ivalue);
    int (*pop)(struct stack* stack);
};

int stack_isEmpty1(struct stack* stack);           
int stack_isFull1(struct stack* stack);            
void stack_push1(struct stack* stack, int ivalue);
int stack_pop1(struct stack* stack);

void stack_init1(struct stack* stack)
{
    stack->isEmpty = &stack_isEmpty1;
    stack->isFull = &stack_isFull1;
    stack->push = &stack_push1;
    stack->pop = &stack_pop1;
    ...
}

int stack_isEmpty2(struct stack* stack);           
int stack_isFull2(struct stack* stack);            
void stack_push2(struct stack* stack, int ivalue);
int stack_pop2(struct stack* stack);

void stack_init2(struct stack* stack)
{
    stack->isEmpty = &stack_isEmpty2;
    stack->isFull = &stack_isFull2;
    stack->push = &stack_push2;
    stack->pop = &stack_pop2;
    ...
}

所以现在如果你有 2 个堆栈对象,分别用 stack_init1 和 stack_init2 初始化,它们每个都会调用自己的函数集。示例:

struct stack* a, b;
stack_init1(a);
stack_init2(b);

/* This will call stack_isEmpty1*/
a->isEmpty(a);

/* This will call stack_isEmpty2*/
b->isEmpty(b);