#include <iostream>#include <cstdio>#include <cstdlib>#include <assert.h>using namespace std;//宏定義實(shí)現(xiàn)泛型//在宏定義中出現(xiàn)#和##,通常起到下面的作用:// #表示:對(duì)應(yīng)變量字符串化// ##表示:把宏參數(shù)名與宏定義代碼序列中的標(biāo)識(shí)符連接在一起,形成一個(gè)新的標(biāo)識(shí)符#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()函數(shù)內(nèi),因?yàn)檫@個(gè)宏定義展開(kāi)后包含其他函數(shù)的定義,故不能//宏定義生成兩個(gè)不同類(lèi)型的堆棧//其結(jié)尾加不加';'都可以,注意下面的宏定義會(huì)被展開(kāi)成什么(文本替換)GNERIC_STACK(int,_int,10)//##起到連接作用,比如is_empty##SUFFIX(),SUFFIX為_(kāi)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;}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注