zoukankan      html  css  js  c++  java
  • 基于链式链表的栈链式存储的C风格实现

    链式链表的头文件与CPP文件见前文

    头文件:

     1 #ifndef _LINKSTACK_H_
     2 #define _LINKSTACK_H_
     3  
     4  
     5 typedef void LinkStack;
     6 //创建一个栈
     7 LinkStack* LinkStack_Create();
     8 //删除一个栈
     9 void LinkStack_Destroy(LinkStack* stack);
    10 //清空一个栈
    11 void LinkStack_Clear(LinkStack* stack);
    12 //入栈
    13 int LinkStack_Push(LinkStack* stack, void* item);
    14 //出栈
    15 void* LinkStack_Pop(LinkStack* stack);
    16 //获取栈顶元素
    17 void* LinkStack_GetTop(LinkStack* stack);
    18 //获取栈的长度
    19 int LinkStack_GetSize(LinkStack* stack);
    20  
    21  
    22  
    23 #endif

    CPP文件:

      1 #include "linkList.h"
      2 #include "linkStack.h"
      3 #include <iostream>
      4  
      5 //
      6 //需要调用前边的LinkList.H
      7 //
      8 using namespace std;
      9 //定义一个抽象的栈节点模型 
     10 //也就是用链式链表的抽象模型来存储item 以便插入元素
     11 //就像
     12 //struct TEMP
     13 //{
     14 //    LinkListNode node;
     15 //    int a;
     16 //    char b;
     17 //    float c;
     18 //    ......
     19 //    这样的数据结构
     20 //};
     21 typedef struct _tag_LinkstackNode
     22 {
     23     LinkListNode node;
     24     void* item;
     25  
     26 }LinkStackNode;
     27  
     28 //创建一个栈  相当于创建一个线性表
     29 LinkStack* LinkStack_Create()
     30 {
     31     return LinkList_Create();
     32 }
     33 //删除一个栈 相当于删除一个线性表
     34 //先清空一个栈 再删除一个链表
     35 void LinkStack_Destroy(LinkStack* stack)
     36 {
     37     LinkStack_Clear(stack);
     38     LinkList_Destory(stack);
     39     return;
     40 }
     41 //清空一个栈  相当于清空一个线性表
     42 //注意元素都是动态分配的内存
     43 //应该先把所有元素弹出,并释放节点内存
     44 void LinkStack_Clear(LinkStack* stack)
     45 {
     46     if (stack == NULL)
     47     {
     48         return;
     49     }
     50     while(LinkStack_GetSize(stack) > 0)
     51     {
     52         LinkStack_Pop(stack);  
     53     }
     54     return;
     55 }
     56 //入栈 == 向链表头插入元素
     57 int LinkStack_Push(LinkStack* stack, void* item)
     58 {
     59     int ret = 0;
     60     //先定义一个临时LinkStackNode指针变量temp
     61     LinkStackNode* temp = NULL;
     62     //现在是想存储temp的
     63     //为了防止函数结束时temp被析构必须分配内存
     64     temp = (LinkStackNode*)malloc(sizeof(LinkStackNode));
     65     //异常处理
     66     if (temp == NULL)
     67     {
     68         cout << "Push Temp Err" << endl;
     69         return -1;
     70     }
     71     memset(temp, 0, sizeof(LinkStackNode));
     72     //将item 也就是所需要存储的信息传递给temp->item
     73     temp->item = item;
     74     //现在可以直接插入
     75     ret = LinkList_Insert(stack, (LinkListNode*)temp, 0);
     76     //异常处理
     77     if (ret != 0)
     78     {
     79         cout << "Fucn Insert Err" << endl;
     80         //为了防止内存插入失败而导致内存泄漏
     81         if (temp != NULL)
     82         {
     83             free(temp);
     84         }
     85         return -2;
     86     }
     87     return 0;
     88 }
     89 //出栈
     90 void* LinkStack_Pop(LinkStack* stack)
     91 {
     92     //定义一个中间缓存
     93     void* item = NULL;
     94     LinkStackNode* _temp = NULL; //定义一个框架
     95     _temp = (LinkStackNode*)LinkList_Delete(stack, 0);
     96     if (_temp == NULL)
     97     {
     98         return NULL;
     99     }
    100  
    101     item = _temp->item ;
    102     //因为插入时已经分配了内存
    103     //因此出栈时需要释放,
    104     free(_temp);
    105     return item;
    106 }
    107 //获取栈顶元素
    108 void* LinkStack_GetTop(LinkStack* stack)
    109 {
    110     LinkStackNode* temp = NULL; //定义一个框架
    111     temp = (LinkStackNode*)LinkList_Get(stack, 0);
    112     if (temp == NULL)
    113     {
    114         cout << "GetTOP ERR (temp = NULL) " << endl;
    115         return NULL;
    116     }
    117     return temp->item;
    118 }
    119 //获取栈的长度
    120 int LinkStack_GetSize(LinkStack* stack)
    121 {
    122     return LinkList_Length(stack);
    123 }
    124  
    125  

    测试函数:

     1 #include <iostream>
     2 #include "linkStack.h"
     3 using namespace std;
     4  
     5  
     6 int main ()
     7 {
     8     int i = 0;
     9     int a[10];
    10  
    11     LinkStack* stack = NULL;
    12     stack = LinkStack_Create();
    13     if(stack == NULL)
    14     {
    15         return -1;
    16     }
    17     //入栈
    18     for (i = 0; i < 5 ; i++)
    19     {
    20         a[i] = i + 1;
    21         LinkStack_Push(stack, &a[i]);
    22     }
    23     //显示大小和栈顶元素
    24     cout << "Size: " << LinkStack_GetSize(stack) << endl;
    25  
    26     cout << "Top: "  << *((int *)LinkStack_GetTop(stack)) << endl;
    27  
    28     //出栈
    29     while(LinkStack_GetSize(stack) != 0)
    30     {
    31         cout << "Pop: "  << *((int *)LinkStack_Pop(stack)) << endl;
    32     }
    33     //入栈
    34     LinkStack_Push(stack, &a[1]);
    35     cout << "Size: " << LinkStack_GetSize(stack) << endl;
    36     //清空
    37     LinkStack_Clear(stack);
    38     cout << "After Clear Size: " << LinkStack_GetSize(stack) << endl;
    39     //删除一个栈
    40     LinkStack_Destroy(stack);
    41  
    42     system("pause");
    43     return 0;
    44 }
    45  
  • 相关阅读:
    53、Gif 控件GifView 的使用,播放gif图片
    52、图片缩放库 PhotoView
    51、自定义View基础和原理
    Adapter适配器 final int Id 导致选中的Item不在当前界面
    Linux目录结构
    Linux包管理工具分析
    Linux 软件包安装管理
    MySQL配置详解
    MySQL 5.5.x配置文件详解
    Linux Apache2 配置介绍
  • 原文地址:https://www.cnblogs.com/Lxk0825/p/9519946.html
Copyright © 2011-2022 走看看