• 栈这种数据结构就太常见了

    其特性也就是last in first out (lifo),也就是因为它的这个特性,其是计算机的组成中的一个重要的数据结构

     栈有两种形式,顺序结构和链式结构

    ①顺序栈

     1 #ifndef _SEQSTACK_H_
     2 #define _SEQSTACK_H_
     3 
     4 typedef void SeqStack;
     5 
     6 SeqStack* SeqStack_Create(int capacity);
     7 
     8 void SeqStack_Destroy(SeqStack* stack);
     9 
    10 void SeqStack_Clear(SeqStack* stack);
    11 
    12 int SeqStack_Push(SeqStack* stack, void* item);
    13 
    14 void* SeqStack_Pop(SeqStack* stack);
    15 
    16 void* SeqStack_Top(SeqStack* stack);
    17 
    18 int SeqStack_Size(SeqStack* stack);
    19 
    20 int SeqStack_Capacity(SeqStack* stack);
    21 
    22 #endif
    #include "SeqStack.h"
    #include "SeqList.h"
    
    SeqStack* SeqStack_Create(int capacity)
    {
        return SeqList_Create(capacity);
    }
    
    void SeqStack_Destroy(SeqStack* stack)
    {
        SeqList_Destroy(stack);
    }
    
    void SeqStack_Clear(SeqStack* stack)
    {
        SeqList_Clear(stack);
    }
    
    int SeqStack_Push(SeqStack* stack, void* item)
    {
        return SeqList_Insert(stack, item, SeqList_Length(stack));
    }
    
    void* SeqStack_Pop(SeqStack* stack)
    {
        return SeqList_Delete(stack, SeqList_Length(stack) - 1);
    }
    
    void* SeqStack_Top(SeqStack* stack)
    {
        return SeqList_Get(stack, SeqList_Length(stack) - 1);
    }
    
    int SeqStack_Size(SeqStack* stack)
    {
        return SeqList_Length(stack);
    }
    
    int SeqStack_Capacity(SeqStack* stack)
    {
        return SeqList_Capacity(stack);
    }
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include "SeqStack.h"
     4 
     5 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
     6 
     7 int main(int argc, char *argv[]) 
     8 {
     9     SeqStack* stack = SeqStack_Create(20);
    10     int a[10];
    11     int i = 0;
    12     
    13     for(i=0; i<10; i++)
    14     {
    15         a[i] = i;
    16         
    17         SeqStack_Push(stack, a + i);
    18     }
    19     
    20     printf("Top: %d
    ", *(int*)SeqStack_Top(stack));
    21     printf("Capacity: %d
    ", SeqStack_Capacity(stack));
    22     printf("Length: %d
    ", SeqStack_Size(stack));
    23     
    24     while( SeqStack_Size(stack) > 0 )
    25     {
    26         printf("Pop: %d
    ", *(int*)SeqStack_Pop(stack));
    27     }
    28     
    29     SeqStack_Destroy(stack);
    30     
    31     return 0;
    32 }

    链式表

     1 #ifndef _LINKSTACK_H_
     2 #define _LINKSTACK_H_
     3 
     4 typedef void LinkStack;
     5 
     6 LinkStack* LinkStack_Create();
     7 
     8 void LinkStack_Destroy(LinkStack* stack);
     9 
    10 void LinkStack_Clear(LinkStack* stack);
    11 
    12 int LinkStack_Push(LinkStack* stack, void* item);
    13 
    14 void* LinkStack_Pop(LinkStack* stack);
    15 
    16 void* LinkStack_Top(LinkStack* stack);
    17 
    18 int LinkStack_Size(LinkStack* stack);
    19 
    20 #endif
     1 #include <malloc.h>
     2 #include "LinkStack.h"
     3 #include "LinkList.h"
     4 
     5 typedef struct _tag_LinkStackNode
     6 {
     7     LinkListNode header;
     8     void* item;
     9 } TLinkStackNode;
    10 
    11 LinkStack* LinkStack_Create()
    12 {
    13     return LinkList_Create();
    14 }
    15 
    16 void LinkStack_Destroy(LinkStack* stack)
    17 {
    18     LinkStack_Clear(stack);
    19     LinkList_Destroy(stack);
    20 }
    21 
    22 void LinkStack_Clear(LinkStack* stack)
    23 {
    24     while( LinkStack_Size(stack) > 0 )
    25     {
    26         LinkStack_Pop(stack);
    27     }
    28 }
    29 
    30 int LinkStack_Push(LinkStack* stack, void* item)
    31 {
    32     TLinkStackNode* node = (TLinkStackNode*)malloc(sizeof(TLinkStackNode));
    33     int ret = (node != NULL) && (item != NULL);
    34     
    35     if( ret )
    36     {
    37         node->item = item;
    38         
    39         ret  = LinkList_Insert(stack, (LinkListNode*)node, 0);
    40     }
    41     
    42     if( !ret )
    43     {
    44         free(node);
    45     }
    46     
    47     return ret;
    48 }
    49 
    50 void* LinkStack_Pop(LinkStack* stack)
    51 {
    52     TLinkStackNode* node = (TLinkStackNode*)LinkList_Delete(stack, 0);
    53     void* ret = NULL;
    54     
    55     if( node != NULL )
    56     {
    57         ret = node->item;
    58         
    59         free(node);
    60     }
    61     
    62     return ret;
    63 }
    64 
    65 void* LinkStack_Top(LinkStack* stack)
    66 {
    67     TLinkStackNode* node = (TLinkStackNode*)LinkList_Get(stack, 0);
    68     void* ret = NULL;
    69     
    70     if( node != NULL )
    71     {
    72         ret = node->item;
    73     }
    74     
    75     return ret;
    76 }
    77 
    78 int LinkStack_Size(LinkStack* stack)
    79 {
    80     return LinkList_Length(stack);
    81 }
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include "LinkStack.h"
     4 
     5 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
     6 
     7 int main(int argc, char *argv[]) 
     8 {
     9     LinkStack* stack = LinkStack_Create();
    10     int a[10];
    11     int i = 0;
    12     
    13     for(i=0; i<10; i++)
    14     {
    15         a[i] = i;
    16         
    17         LinkStack_Push(stack, a + i);
    18     }
    19     
    20     printf("Top: %d
    ", *(int*)LinkStack_Top(stack));
    21     printf("Length: %d
    ", LinkStack_Size(stack));
    22     
    23     while( LinkStack_Size(stack) > 0 )
    24     {
    25         printf("Pop: %d
    ", *(int*)LinkStack_Pop(stack));
    26     }
    27     
    28     LinkStack_Destroy(stack);
    29     
    30     return 0;
    31 }

    栈这种数据结构虽然简单,但是却用的很频繁

  • 相关阅读:
    JavaScript 原型和原型链 prototype
    javascript dom 表单元素之 radio
    JavaScript Dom 表单元素之 checkbox
    JavaScript DOM 表单元素之 select
    JavaScript-ECMAScript 之模块
    Javascript--ECMAScript 之 this
    Javascript-ECMAscript--Array.prototype.slice() 方法
    JavaScript -ECMAScriopt: Array.prototype.slice.call()详解及转换数组的方法
    JavaScript-ECMASCript apply call bind
    requests的深入刨析及封装调用
  • 原文地址:https://www.cnblogs.com/xiaowulang/p/10798073.html
Copyright © 2020-2023  润新知