• C语言栈的实现


    栈是常用的数据结构之一,下面给出一个链式栈的实现~~
    头文件Stack.h

    #ifndef Stack_H
    #define Stack_H
    
    typedef int Item;
    typedef struct node * PNode;
    /*定义栈节点类型*/
    typedef struct node
    {
        Item data;
        PNode down;
    }Node;
    /*定义栈类型*/
    typedef struct stack
    {
        PNode top;
        int size;
    }Stack;
    /*构造一个空栈*/
    Stack *InitStack();
    
    /*销毁一个栈*/
    void DestroyStack(Stack *ps);
    
    /*把栈置空*/
    void ClearStack(Stack *ps);
    
    /*判定是否为空栈*/
    int IsEmpty(Stack *ps);
    
    /*返回栈大小*/
    int GetSize(Stack *ps);
    
    /*返回栈顶元素*/
    PNode GetTop(Stack *ps,Item *pitem);
    
    /*元素入栈*/
    PNode Push(Stack *ps,Item item);
    
    /*元素出栈*/
    PNode Pop(Stack *ps,Item *pitem);
    
    /*遍历栈并访问visit函数*/
    void StackTraverse(Stack *ps,void (*visit)());
    
    #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 }

     

  • 相关阅读:
    DOM-DOMTree-查找

    用sql语句操作数据库
    数据查询基础
    【案例】城市地址三级联动
    【案例】城市地址二级联动
    【案例】高仿百度注册页
    【案例】自由运动小球
    【案例】使用上下左右键控制元素的移动
    事件
  • 原文地址:https://www.cnblogs.com/stemon/p/3411520.html
Copyright © 2020-2023  润新知