//本標頭檔採用中英文兩種語言注釋,意在大家都能看懂<br />//This head file consists of the two language of Chinese and English</p><p>/**********************************************************************<br />**<br />**--------------------------file infomation----------------------------<br />**file name:stack.h<br />**<br />**last modified date:2010-7-30<br />**<br />**descriptioin:對於棧的各種操作------any operation of the stack<br />**<br />**created by:Ethan Wei<br />***********************************************************************/</p><p>/**********************************************************************<br />標頭檔------head file<br />**********************************************************************/<br />#include <stdio.h><br />#include <stdlib.h></p><p>/**********************************************************************<br />宏定義------macro definition<br />**********************************************************************/<br />#define Type int<br />#define INITIAL_SIZE 30//棧的初始化大小---initial size of the stack<br />#define INCREASE_SIZE 20//棧大小的增量-----increase size of the stack<br />#define ROW 10//列印棧中元素的每行個數---the number of row<br />#define debug</p><p>/*************************************************************************<br />結構體的定義-----------struct definition<br />*************************************************************************/<br />typedef struct stack<br />{<br />Type *data;<br />int top;//棧頂指標----top stack point<br />int StackSize;//棧的大小----size of the stack<br />}Stack;</p><p>/*************************************************************************<br />函數定義--------function definition<br />*************************************************************************/</p><p>/*************************************************************************<br />函數名稱:InitStack<br />函數表述: 對棧進行初始化<br />輸入值: Stack *<br />傳回值: 初始化成功返回0,否則退出<br />*************************************************************************/<br />int InitStack(Stack *stack)<br />{<br />stack->data = (Type *)malloc(INITIAL_SIZE*sizeof(Type)); //為元素開闢空間--alloc the space for element<br />if(stack->data == NULL)<br />{<br />fprintf(stderr,"開闢空間失敗");<br />exit(1);<br />}<br />stack->top = -1;//棧頂指標為-1--set top point -1<br />stack->StackSize = INITIAL_SIZE;//初始化大小----set initial size</p><p>#ifdef debug<br />puts("初始化棧成功!");<br />#endif</p><p>return 0;<br />}</p><p>/*************************************************************************<br />函數名稱:Push<br />函數表述: 壓棧操作<br />輸入值: Stack *,Type<br />傳回值: 初始化成功返回0,否則返回1<br />*************************************************************************/<br />int Push(Stack *stack,Type elem)<br />{<br />if(stack->top >= stack->StackSize - 1)<br />{<br />//如果空間不夠了,則重新開闢新的空間--if the space is not enough,realloc the space<br />stack->data = (Type *)realloc(stack->data,(stack->StackSize + INCREASE_SIZE)*sizeof(Type));<br />stack->StackSize += INCREASE_SIZE;</p><p>#ifdef debug<br />puts("開闢新空間成功!");<br />#endif</p><p>if(stack->data == NULL)<br />{<br />fprintf(stderr,"開闢空間失敗,棧已經滿了!/n");<br />return 1;<br />}<br />}<br />stack->top += 1;<br />stack->data[stack->top] = elem;</p><p>#ifdef debug<br />puts("壓棧成功!");<br />#endif</p><p>return 0;<br />}</p><p>/*************************************************************************<br />函數名稱:Pop<br />函數表述: 彈棧操作<br />輸入值: Stack *,Type<br />傳回值: 返回彈出的值<br />*************************************************************************/<br />Type Pop(Stack *stack)<br />{<br />Type elem;<br />if(stack->top == -1)<br />{<br />fprintf(stderr,"棧已經空,彈棧失敗!");<br />exit(1);<br />}<br />elem = stack->data[stack->top];</p><p>stack->top --;<br />#ifdef debug<br />puts("彈棧成功!");<br />#endif<br />return elem;<br />}</p><p>/*************************************************************************<br />函數名稱:IsEmpty<br />函數表述: 判斷棧是否為空白<br />輸入值: Stack *,Type<br />傳回值: 為空白返回1,否則返回0<br />*************************************************************************/<br />int IsEmpty(Stack *stack)<br />{<br />if(stack->top == -1)<br />{<br />return 1;<br />}</p><p>return 0;<br />}</p><p>/*************************************************************************<br />函數名稱:Traversal<br />函數表述: 遍曆棧<br />輸入值: Stack *,Type<br />傳回值: 無<br />*************************************************************************/<br />void Traversal(Stack *stack)<br />{<br />int i;</p><p>puts("棧中元素:");<br />for(i = stack->top;i >= 0;i --)<br />{<br />printf("%d ",stack->data[i]);</p><p>if(i % ROW == 0)<br />{<br />puts("");<br />}<br />}<br />puts("");<br />}</p><p>/*************************************************************************<br />函數名稱:getTopElem<br />函數表述: 獲得棧頂元素<br />輸入值: Stack *,Type<br />傳回值: 返回棧頂元素<br />*************************************************************************/<br />Type getTopElem(Stack *stack)<br />{<br />Type top;<br />top = stack->data[stack->top];<br />return top;<br />}