五、蛤蟆的数据结构笔记之五链栈实现

5、蛤蟆的数据结构笔记之五链栈实现

5、蛤蟆的数据结构笔记之五链栈实现

    本篇名言:“人生就像奕棋,一步失误,全盘皆输。

         昨天对栈和队列进行了定义。这次我们来看下如何使用代码来实现链栈和链队列,后续蛤蟆会记录如何将栈应用到实际问题中。

         栈一般是顺序结构,但是也可以采用链式存储结构,具体如下实现。

 欢迎转载,转载请标明出处:http://blog.****.net/notbaron/article/details/46447195

1.  定义结构体

 

#defineMAX_STACKS10

typedefstruct {

         intkey;

         /*otherfields */

}element;

 

typedefstruct stack *stack_pointer;

typedefstruct stack {

         elementitem;

         stack_pointerlink;

};

stack_pointer top[MAX_STACKS];

两个结构体,其中一个结构包含在另一个结构体中。

定义了链栈中节点上限数量为10.

 

 

2.  链栈的插入

 

void add(stack_pointer *top,elementitem)

{

         stack_pointertemp = (stack_pointer)malloc(sizeof(stack));

         if(IS_EMPTY(temp)){

                   fprintf(stderr,"Thememory is full\n");

                   exit(1);

         }

         temp->item= item;

         temp->link=*top;

         *top =temp;

}

函数需要输入top 指向栈顶元素。需要入栈的元素,element。

 

3.  链栈的删除

删除节点函数,返回栈顶元素,并改变top,使其指向包含在其链域中的地址。典型调用item=deletenode(&top[stack_no]);

 

element deletenode(stack_pointer *top){

         stack_pointertemp = *top;

         elementitem;

         if (IS_EMPTY(temp)){

                   fprintf(stderr,"Thestack is empty\n");

                   exit(1);

         }

         item =temp->item;

         *top =temp->link;

         free(temp);

         returnitem;

}

 

4.  链栈输出

为便于调式,输出整个链栈中的值。

void print_node(stack_pointer top){

         if (IS_EMPTY(top)){

                   fprintf(stderr,"Thestack is empty\n");

                   exit(1);

         }

         for(top;top;top=top->link)

         {

                   printf("%d   ",top->item);

         }

        

}

 

 

5.  链栈综合

 

如下代码实现一个综合性的测试,最后如下图 1所示:

void main()

{

         inti;

         elementtemp ;

         for(i=0;i<10;i++)

         {

                   top[i]= NULL;

         }      

         for(i=0;i<10;i++)

         {

                   temp.key= i;

                   add(&header,temp);

         }

         printf("afteradd 10 nodes\n");

         print_node(header);

         printf("\n");

         for(i=0;i<4;i++)

         {

                   deletenode(&header);

         }

         printf("afterdelete 4 nodes\n");

         print_node(header);

         printf("\n");

         for(i=0;i<6;i++)

         {

                   deletenode(&header);

         }

         printf("afterdelete left 6 nodes\n");

         print_node(header);

 

}

 五、蛤蟆的数据结构笔记之五链栈实现

  

6.  链栈源码

方便大家编译,所有代码复制如下:

#include"stdio.h"

#include"stdlib.h"

#defineIS_EMPTY(ptr)(!(ptr))

#defineIS_FULL(ptr)  (!(ptr))

#defineMAX_STACKS10

typedefstruct element{

         intkey;

         /*otherfields */

}element;

 

typedefstruct stack *stack_pointer;

typedefstruct stack {

         elementitem;

         stack_pointerlink;

}stack;

stack_pointer top[MAX_STACKS];

stack_pointer header =NULL;

 

void add(stack_pointer *top,elementitem)

{

         stack_pointertemp = (stack_pointer)malloc(sizeof(stack));

         if(IS_EMPTY(temp)){

                   fprintf(stderr,"Thememory is full\n");

                   exit(1);

         }

         temp->item= item;

         temp->link=*top;

         *top =temp;

         header= temp;

}

 

 

element deletenode(stack_pointer *top){

         stack_pointertemp = *top;

         elementitem;

         if (IS_EMPTY(temp)){

                   fprintf(stderr,"Thestack is empty\n");

                   exit(1);

         }

         item =temp->item;

         header= temp->link;

         free(temp);

         returnitem;

}

 

void print_node(stack_pointer top){

         if (IS_EMPTY(top)){

                   fprintf(stderr,"Thestack is empty\n");

                   exit(1);

         }

         for(top;top;top=top->link)

         {

                   printf("%d   ",top->item);

         }

        

}

 

void main()

{

         inti;

         elementtemp ;

         for(i=0;i<10;i++)

         {

                   top[i]= NULL;

         }      

         for(i=0;i<10;i++)

         {

                   temp.key= i;

                   add(&header,temp);

         }

         printf("afteradd 10 nodes\n");

         print_node(header);

         printf("\n");

         for(i=0;i<4;i++)

         {

                   deletenode(&header);

         }

         printf("afterdelete 4 nodes\n");

         print_node(header);

         printf("\n");

         for(i=0;i<6;i++)

         {

                   deletenode(&header);

         }

         printf("afterdelete left 6 nodes\n");

         print_node(header);

 

}