#include <iostream>#include <cstdio>#include <cstdlib>#include <assert.h>using namespace std;//宏定義實現泛型//在宏定義中出現#和##,通常起到下面的作用:// #表示:對應變量字符串化// ##表示:把宏參數名與宏定義代碼序列中的標識符連接在一起,形成一個新的標識符#define GNERIC_STACK(STACK_TYPE,SUFFIX,STACK_SIZE)  /	static STACK_TYPE stack##SUFFIX[STACK_SIZE];    /	static int top_element##SUFFIX=-1;			    /	bool is_empty##SUFFIX(){						/		return top_element##SUFFIX==-1;			    /	}                       					    /													/	bool is_full##SUFFIX(){							/		return top_element##SUFFIX==STACK_SIZE-1;	/	}												/													/	void push##SUFFIX(STACK_TYPE val){				/		assert(!is_full##SUFFIX());					/		top_element##SUFFIX+=1;						/		stack##SUFFIX[top_element##SUFFIX]=val;		/	}												/													/	void pop##SUFFIX(){								/		assert(!is_empty##SUFFIX());				/		top_element##SUFFIX-=1;						/	}												/													/	STACK_TYPE top##SUFFIX(){						/		assert(!is_empty##SUFFIX());   				/		return stack##SUFFIX[top_element##SUFFIX];	/	}//注意,下面的宏定義式子不能放到main()函數內,因為這個宏定義展開后包含其他函數的定義,故不能//宏定義生成兩個不同類型的堆棧//其結尾加不加';'都可以,注意下面的宏定義會被展開成什么(文本替換)GNERIC_STACK(int,_int,10)//##起到連接作用,比如is_empty##SUFFIX(),SUFFIX為_int,即最后生成is_empty_int()GNERIC_STACK(double,_double,10)//同上void test(){	push_int(5);	push_int(10);	push_int(22);	push_double(22.2);	push_double(-33.3);	push_double(-45.4);	while(!is_empty_int()){		cout<<top_int()<<" ";		pop_int();	}	cout<<endl;	while(!is_empty_double()){		cout<<top_double()<<" ";		pop_double();	}	cout<<endl;}int main() {	test();	return 0;}
新聞熱點
疑難解答
圖片精選