zoukankan      html  css  js  c++  java
  • 链式栈

    来源:http://blog.csdn.net/hopeyouknow/article/details/6725049

    栈是常用的数据结构之一,下面给出一个链式栈的实现~~

    头文件Stack.h

    1. #ifndef Stack_H  
    2. #define Stack_H  
    3.   
    4. typedef int Item;  
    5. typedef struct node * PNode;  
    6. /*定义栈节点类型*/  
    7. typedef struct node  
    8. {  
    9.     Item data;  
    10.     PNode down;  
    11. }Node;  
    12. /*定义栈类型*/  
    13. typedef struct stack  
    14. {  
    15.     PNode top;  
    16.     int size;  
    17. }Stack;  
    18. /*构造一个空栈*/  
    19. Stack *InitStack();  
    20.   
    21. /*销毁一个栈*/  
    22. void DestroyStack(Stack *ps);  
    23.   
    24. /*把栈置空*/  
    25. void ClearStack(Stack *ps);  
    26.   
    27. /*判定是否为空栈*/  
    28. int IsEmpty(Stack *ps);  
    29.   
    30. /*返回栈大小*/  
    31. int GetSize(Stack *ps);  
    32.   
    33. /*返回栈顶元素*/  
    34. PNode GetTop(Stack *ps,Item *pitem);  
    35.   
    36. /*元素入栈*/  
    37. PNode Push(Stack *ps,Item item);  
    38.   
    39. /*元素出栈*/  
    40. PNode Pop(Stack *ps,Item *pitem);  
    41.   
    42. /*遍历栈并访问visit函数*/  
    43. void StackTraverse(Stack *ps,void (*visit)());  
    44.   
    45. #endif  


    实现部分Stack.c

    1. #include"Stack.h"  
    2. #include<malloc.h>  
    3. #include<stdlib.h>  
    4. /*构造一个空栈*/  
    5. Stack *InitStack()  
    6. {  
    7.     Stack *ps = (Stack *)malloc(sizeof(Stack));  
    8.     if(ps!=NULL)  
    9.     {  
    10.         ps->top = NULL;  
    11.         ps->size = 0;  
    12.     }  
    13.     return ps;  
    14. }  
    15.   
    16. /*判定是否为空栈*/  
    17. int IsEmpty(Stack *ps)  
    18. {  
    19.     if(ps->top == NULL && ps->size == 0)  
    20.         return 1;  
    21.     else  
    22.         return 0;  
    23. }  
    24.   
    25. /*返回栈大小*/  
    26. int GetSize(Stack *ps)  
    27. {  
    28.     return ps->size;  
    29. }  
    30.   
    31. /*元素入栈*/  
    32. PNode Push(Stack *ps,Item item)  
    33. {  
    34.     PNode pnode = (PNode)malloc(sizeof(Node));  
    35.     if(pnode != NULL)  
    36.     {  
    37.         pnode->data = item;  
    38.         pnode->down = GetTop(ps,NULL);  
    39.         ps->size++;  
    40.         ps->top = pnode;  
    41.           
    42.     }  
    43.     return pnode;  
    44. }  
    45.   
    46. /*返回栈顶元素*/  
    47. PNode GetTop(Stack *ps,Item *pitem)  
    48. {  
    49.     if(IsEmpty(ps)!=1&&pitem!=NULL)  
    50.     {  
    51.         *pitem = ps->top->data;  
    52.     }  
    53.     return ps->top;  
    54. }  
    55.   
    56.   
    57. /*元素出栈*/  
    58. PNode Pop(Stack *ps,Item *pitem)  
    59. {  
    60.     PNode p = ps->top;  
    61.     if(IsEmpty(ps)!=1&&p!=NULL)  
    62.     {  
    63.         if(pitem!=NULL)  
    64.             *pitem = p->data;  
    65.         ps->size--;  
    66.         ps->top = ps->top->down;     
    67.         free(p);  
    68.     }  
    69.     return ps->top;  
    70. }  
    71.   
    72. /*销毁一个栈*/  
    73. void DestroyStack(Stack *ps)  
    74. {  
    75.     if(IsEmpty(ps)!=1)  
    76.         ClearStack(ps);  
    77.     free(ps);  
    78. }  
    79.   
    80. /*把栈置空*/  
    81. void ClearStack(Stack *ps)  
    82. {  
    83.     while(IsEmpty(ps)!=1)  
    84.     {  
    85.         Pop(ps,NULL);  
    86.     }  
    87. }  
    88.   
    89. /*遍历栈并访问visit函数 */  
    90. void StackTraverse(Stack *ps,void (*visit)())  
    91. {  
    92.     PNode p = ps->top;  
    93.     int i = ps->size;  
    94.     while(i--)  
    95.     {  
    96.         visit(p->data);  
    97.         p = p->down;  
    98.     }  
    99. }  


    测试部分Test.c

    1. #include"Stack.h"  
    2. #include<stdio.h>  
    3. void print(Item i)  
    4. {  
    5.     printf("该节点元素为%d ",i);  
    6. }  
    7. main()  
    8. {  
    9.     Stack *ps = InitStack();  
    10.     int i,item;  
    11.   
    12.     printf("0-9依次入栈并输出如下: ");  
    13.     for(i=0;i<10;i++)  
    14.     {  
    15.         Push(ps,i);  
    16.         GetTop(ps,&item);  
    17.         printf("%d ",item);  
    18.     }  
    19.       
    20.     printf(" 从栈顶到栈顶遍历并对每个元素执行print函数: ");  
    21.     StackTraverse(ps,print);  
    22.   
    23.     printf("栈中元素依次出栈并输出如下: ");  
    24.     for(i=0;i<10;i++)  
    25.     {  
    26.         Pop(ps,&item);  
    27.         printf("%d ",item);  
    28.     }  
    29.       
    30.     ClearStack(ps);  
    31.     if(IsEmpty(ps))  
    32.         printf(" 将栈置空成功 ");  
    33.     DestroyStack(ps);  
    34.     printf("栈已被销毁 ");  
    35.           
    36. }  
  • 相关阅读:
    网络编程(1)
    反射,魔法方法,单例模式
    远程的文件传输
    DNS
    windows服务
    outlook邮箱配置
    win7服务器搭建
    windows常用命令
    C盘满了怎么办
    0x80070035找不到网络路径
  • 原文地址:https://www.cnblogs.com/heyonggang/p/3272612.html
Copyright © 2011-2022 走看看