您的位置:首页 > 其它

基于数组或链表的堆栈实现

2006-08-20 21:12 441 查看
本文使用C语言,给出了堆栈的两种实现:基于数组和基于链表的实现方式。

堆栈是一种常用的数据结构,具有“后进先出(Last In First Out)”的特性,常用来进行函数调用时候的参数传递,解决递归函数书的非递归实现,表达式中的括号匹配等问题。堆栈的常用操作如下:

createStack(st):建立一个空栈

push(st, x):将元素x压入栈st当中,使之成为栈顶元素

pop(st,x):当栈非空时,将栈顶元素弹出,并赋值给x

top(st):当栈非空时,返回栈顶元素的值

isEmpty(st):判断栈st是否为空


#include <stdio.h>


#include <assert.h>


#include <stdlib.h>




#define EleType int


#define DEFAULT_SIZE 100






/**//*---------array-based stack--------------*/


#if defined(ARRAY_BASED_STACK)




typedef struct Stack_t ...{


int top;


int capacity;




EleType *container;


}Stack;




int createStack(Stack *st, int c)




...{


if(c<0)


c = DEFAULT_SIZE;


st->container = (EleType*)malloc(c*sizeof(EleType));


if(NULL == st->container) return 0;


st->capacity = c;


st->top = -1;


return 1;


}


int destoryStack(Stack *st)




...{




if(st)...{


st->top = -1;


free(st->container);


st->container = NULL;


}


return 1;


}


int isEmpty(Stack *st)




...{


if(-1 == st->top)


return 1;


else


return 0;


}


EleType top(Stack *st)




...{


return st->container[st->top];


}


int push(Stack *st, EleType e)




...{




if((st->top + 1) == st->capacity) ...{


EleType *tmp = st->container;


st->container = (EleType*)malloc(st->capacity * 2 *sizeof(EleType));


if(!(st->container)) return 0;


st->capacity <<= 1;


int i;


for(i=0; i<st->top; i++)


st->container[i] = tmp[i];


free(tmp);


}


st->top ++;


st->container[st->top] = e;




return 1;


}


int pop(Stack *st, EleType *eptr)




...{




if(-1 == st->top)...{


return 0;


}




else ...{


st->top --;


*eptr = st->container[st->top+1];




if(st->top < (st->capacity>>1)) ...{


EleType *tmp = (EleType*)malloc((st->capacity/2) *sizeof(EleType));




if(tmp) ...{


int i;


for(i=0; i<st->top; i++)


tmp[i] = st->container[i];


free(st->container);


st->container = tmp;


}


}


return 1;


}


}


#endif




/**//*------------link-based stack-------------*/




typedef struct Element_t...{


void *data;


struct Element_t *next;


}Element;




int createStack(Element **st);


int destoryStack(Element **st);


int push(Element **st, void *data);


int pop(Element **st, void **data);


int isEmpty(Element **st);


void * top(Element **st);




int createStack(Element **st)




...{


*st = NULL;


return 1;


}


int destoryStack(Element **st)




...{


Element *next = NULL;




while(*st)...{


next = (*st)->next;


free(*st);


*st = next;


}


return 1;


}


int push(Element **st, void *data)




...{


Element *tmp = (Element*)malloc(sizeof(*tmp));


if(!tmp)


return 0;




else ...{


tmp->data = data;


tmp->next = *st;


(*st)->next = tmp;


return 1;


}


}


int pop(Element **st, void **data)




...{


if(!(*st))


return 0;




else ...{


Element *t = *st;


*data = t->data;


*st = t->next;


free(t);


return 1;


}


}


int isEmpty(Element **st)




...{


if(!(*st))


return 0;


else


return 1;


}


void* top(Element **st)




...{


if(!(*st))


return (*st)->data;


else


return NULL;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: