00001 #include <stdio.h> 00002 #include <stdlib.h> 00003 00004 #include "stack.h" 00005 00006 int StackNotEmpty(stk_stack * theStack) { 00007 return( theStack ? (int) theStack->top : 0); 00008 } 00009 00010 stk_stack * StackJoin(stk_stack * stack1, stk_stack * stack2) { 00011 if (!stack1->tail) { 00012 free(stack1); 00013 return(stack2); 00014 } else { 00015 stack1->tail->next=stack2->top; 00016 stack1->tail=stack2->tail; 00017 free(stack2); 00018 return(stack1); 00019 } 00020 } 00021 00022 stk_stack * StackCreate() { 00023 stk_stack * newStack; 00024 00025 if (!(newStack=(stk_stack *) malloc(sizeof(stk_stack)))) { 00026 return NULL; 00027 } 00028 newStack->top=newStack->tail=NULL; 00029 return(newStack); 00030 } 00031 00032 00033 void StackPush(stk_stack * theStack, DATA_TYPE newInfoPointer) { 00034 stk_stack_node * newNode; 00035 00036 if(!theStack->top) { 00037 if (!(newNode=(stk_stack_node *) malloc(sizeof(stk_stack_node)))) { 00038 return NULL; 00039 } 00040 newNode->info=newInfoPointer; 00041 newNode->next=theStack->top; 00042 theStack->top=newNode; 00043 theStack->tail=newNode; 00044 } else { 00045 if (!(newNode=(stk_stack_node *) malloc(sizeof(stk_stack_node)))) { 00046 return NULL; 00047 } 00048 newNode->info=newInfoPointer; 00049 newNode->next=theStack->top; 00050 theStack->top=newNode; 00051 } 00052 00053 } 00054 00055 DATA_TYPE StackPop(stk_stack * theStack) { 00056 DATA_TYPE popInfo; 00057 stk_stack_node * oldNode; 00058 00059 if(theStack->top) { 00060 popInfo=theStack->top->info; 00061 oldNode=theStack->top; 00062 theStack->top=theStack->top->next; 00063 free(oldNode); 00064 if (!theStack->top) theStack->tail=NULL; 00065 } else { 00066 popInfo=NULL; 00067 } 00068 return(popInfo); 00069 } 00070 00071 void StackDestroy(stk_stack * theStack,void DestFunc(void * a)) { 00072 stk_stack_node * x=theStack->top; 00073 stk_stack_node * y; 00074 00075 if(theStack) { 00076 while(x) { 00077 y=x->next; 00078 DestFunc(x->info); 00079 free(x); 00080 x=y; 00081 } 00082 free(theStack); 00083 } 00084 } 00085