笔试遇到这样一个题,偶傻傻地用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;
}
原贴链接为: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;
}