【数据结构总结】堆栈

来源:互联网 发布:环保工作有哪些 知乎 编辑:程序博客网 时间:2024/05/16 19:23

问题:用链表或者数组来实现一个堆栈,要求,易用,规范,并具有完备的接口。

堆栈的适用任务:
保证子历程中返回地址、参数和局部变量(这一点的作用域递归函数可谓异曲同工,实际上,递归函数就是堆栈数据结构的另一种形式)
编译器解析语法时,保存各种语法的元素记号(如果分析一个程序段的时候,一个主程序中反复调用若干子程序,分析的时候,这些函数或者自变量都是在堆栈中的)

选用链表这种形式的话,栈顶指针一定是在链表头的位置,这样才能方便删除和插入


堆栈的接口:
pop、push、create和delete
参数分析:
pop是出栈,参数需要有一个指向堆栈的指针并有一个返回值。
push是入栈,参数需要一个指向堆栈的指针和一个需要入栈的参数的值。
create,其实就是创建一个空栈,参数需要一个栈顶指针。
delete,将栈顶指针置为空,参数需要一个栈顶指针。

接口的完备规范,往往是函数具有相同的形式的返回值或者参数传递形式。
int pop(element **stack, void **data);——“**”,是因为C中不支持传地址,所以就利用指针的指针在子函数中修改父函数的值。pop函数中,原堆栈的栈顶指针stack因为出栈发生了变化,故要用“**”,数据指针也具有相同的原因。
int push(element **stack, void *data);
int createStack(element **stack);
int deleteStack(element **stack);

接口的代码实现:
int push(element **stack, void *data){
if(!*stack)
ruturn 0;

element *elen=(element *)malloc(element);         
if(!elen)
return 0;

elen->data=data;

elen->next=*stack;
*stack=elen;

return 1;
}

int pop(element **stack, void **data)
{
if(!*stack)
return 0;

element* elen=(element *)malloc(sizeof(element));

*data=*stack->data;
elen=*stack;
*stack=*stack->next;

free(elen);
return 1;
}

int createStack(element **stack)
{
if(*stack)
return 0;
*stack=(element*)malloc(sizeof(element));
*stack=NULL;
return 1;
)

int deleteStack(elelment **stack)
{
if(!*stack)
return;

element *elen=(element *)malloc(sizeof(element));
while(*stack)
{
elen=*stack;
*stack=*stack->next;
free(elen);
}
return 1;
}

原创粉丝点击