学习日记--用宏来实现模板

本文介绍了一种使用宏定义实现泛型栈的方法,并提供了一个具体的示例代码。该方法允许在不使用模板的情况下创建能够存储不同类型的泛型栈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

笔试遇到这样一个题,偶傻傻地用union来实现(题上只要求double和char),回来一搜,才发现偶是完全错了,难怪会被鄙视了,啊啊啊,第一次笔试被鄙视啊,记住了,用宏来实现模板,转一个堆栈的例子:
原贴链接为:https://forum.eviloctal.com/read.php?tid=15557
#ifndef STACK_H
#define STACK_H

#ifndef MY_BOOL
#define MY_BOOL
#define TRUE 1
#define FALSE 0
typedef int BOOL;
#endif

/*栈类型栈结点结构*/
#define DEFINE_STACK_NODE(type,name) /
typedef struct name##STACK_NODE{/
type data;/
struct name##STACK_NODE *prior;/
}name##STACK_NODE;

/*泛类型栈定义*/
#define DEFINE_STACK(type,name) /
DEFINE_STACK_NODE(type,name)/
struct name##STACK{/
int size;/
struct name##STACK_NODE *base;/
struct name##STACK_NODE *top;/
}name##STACK

#define INIT_STACK(name)/
do{/
name##STACK.base=name##STACK.top=(void *)0;/
name##STACK.size=0;/
}while(0)

/*********** 不破坏栈顶元素取值*************************/
#define GET_STACK(name,elem) do{/
if(name##STACK.size){/
*elem=name##STACK.top->data;/
}/
}while(0)

/************** 压入元素elem **************************/
#define PUSH_STACK(name,elem) do{/
name##STACK_NODE *temp=(name##STACK_NODE *)malloc(sizeof(name##STACK_NODE));/
temp->data=elem;/
++(name##STACK.size);/
if(1!=name##STACK.size){/
temp->prior=name##STACK.top;/
name##STACK.top=temp;/
}/
else{/
temp->prior=(void *)0;/
name##STACK.top=name##STACK.base=temp;/
}/
}while(0)

/********** 栈顶元素赋值给elem,并弹出 ***********/
#define POP_STACK(name,elem) do{/
name##STACK_NODE *temp=name##STACK.top;/
if(name##STACK.size){/
*elem =name##STACK.top->data;/
if(1!=name##STACK.size--){/
name##STACK.top =temp->prior;/
}/
else{/
name##STACK.top=name##STACK.base=(void *)0;/
}/
free(temp);/
}/
}while(0)

/************** 清空栈 ************************/
#define CLEAR_STACK(name) do{/
for(;name##STACK.size;--name##STACK.size){/
name##STACK_NODE *temp=name##STACK.top;/
name##STACK.top=name##STACK.top->prior;/
free(temp);/
}/
name##STACK.base=name##STACK.top=(void *)0;/
}while(0)

/****************栈空???? ************************/
#define EMPTY_STACK(name) (!name##STACK.size)?(TRUE):(FALSE)

/*****************长度 ************************/
#define LENGTH_STACK(name) (1?name##STACK.size:0)

#endif


再接着一段测试的代码:

#include <stdio.h>
#include "my_stack.h"

DEFINE_STACK(int,A);
int main(void)
{
  DEFINE_STACK(double,B);
 
  int a;
  double b;
 
  INIT_STACK(A);
  INIT_STACK(B);
  printf("%d ",LENGTH_STACK(A));

  for(a=1;a<=100;a++){
  PUSH_STACK(A,a);
  PUSH_STACK(A,a);
  PUSH_STACK(A,a);
  }
  printf("%d ",LENGTH_STACK(A));

  for(a=1;a<=100;a++){
  PUSH_STACK(B,(double)a);
  }

  while( ! EMPTY_STACK(A)){
  POP_STACK(A,&a);
  if( ! EMPTY_STACK(B)){
      POP_STACK(B,&b);
  }
  }
  CLEAR_STACK(A);
  CLEAR_STACK(B);

  return 0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值