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

头文件:

 #ifndef _LINKSTACK_H_
#define _LINKSTACK_H_ typedef void LinkStack;
//创建一个栈
LinkStack* LinkStack_Create();
//删除一个栈
void LinkStack_Destroy(LinkStack* stack);
//清空一个栈
void LinkStack_Clear(LinkStack* stack);
//入栈
int LinkStack_Push(LinkStack* stack, void* item);
//出栈
void* LinkStack_Pop(LinkStack* stack);
//获取栈顶元素
void* LinkStack_GetTop(LinkStack* stack);
//获取栈的长度
int LinkStack_GetSize(LinkStack* stack); #endif

CPP文件:

 #include "linkList.h"
#include "linkStack.h"
#include <iostream> //
//需要调用前边的LinkList.H
//
using namespace std;
//定义一个抽象的栈节点模型
//也就是用链式链表的抽象模型来存储item 以便插入元素
//就像
//struct TEMP
//{
// LinkListNode node;
// int a;
// char b;
// float c;
// ......
// 这样的数据结构
//};
typedef struct _tag_LinkstackNode
{
LinkListNode node;
void* item; }LinkStackNode; //创建一个栈 相当于创建一个线性表
LinkStack* LinkStack_Create()
{
return LinkList_Create();
}
//删除一个栈 相当于删除一个线性表
//先清空一个栈 再删除一个链表
void LinkStack_Destroy(LinkStack* stack)
{
LinkStack_Clear(stack);
LinkList_Destory(stack);
return;
}
//清空一个栈 相当于清空一个线性表
//注意元素都是动态分配的内存
//应该先把所有元素弹出,并释放节点内存
void LinkStack_Clear(LinkStack* stack)
{
if (stack == NULL)
{
return;
}
while(LinkStack_GetSize(stack) > )
{
LinkStack_Pop(stack);
}
return;
}
//入栈 == 向链表头插入元素
int LinkStack_Push(LinkStack* stack, void* item)
{
int ret = ;
//先定义一个临时LinkStackNode指针变量temp
LinkStackNode* temp = NULL;
//现在是想存储temp的
//为了防止函数结束时temp被析构必须分配内存
temp = (LinkStackNode*)malloc(sizeof(LinkStackNode));
//异常处理
if (temp == NULL)
{
cout << "Push Temp Err" << endl;
return -;
}
memset(temp, , sizeof(LinkStackNode));
//将item 也就是所需要存储的信息传递给temp->item
temp->item = item;
//现在可以直接插入
ret = LinkList_Insert(stack, (LinkListNode*)temp, );
//异常处理
if (ret != )
{
cout << "Fucn Insert Err" << endl;
//为了防止内存插入失败而导致内存泄漏
if (temp != NULL)
{
free(temp);
}
return -;
}
return ;
}
//出栈
void* LinkStack_Pop(LinkStack* stack)
{
//定义一个中间缓存
void* item = NULL;
LinkStackNode* _temp = NULL; //定义一个框架
_temp = (LinkStackNode*)LinkList_Delete(stack, );
if (_temp == NULL)
{
return NULL;
} item = _temp->item ;
//因为插入时已经分配了内存
//因此出栈时需要释放,
free(_temp);
return item;
}
//获取栈顶元素
void* LinkStack_GetTop(LinkStack* stack)
{
LinkStackNode* temp = NULL; //定义一个框架
temp = (LinkStackNode*)LinkList_Get(stack, );
if (temp == NULL)
{
cout << "GetTOP ERR (temp = NULL) " << endl;
return NULL;
}
return temp->item;
}
//获取栈的长度
int LinkStack_GetSize(LinkStack* stack)
{
return LinkList_Length(stack);
}

测试函数:

 #include <iostream>
#include "linkStack.h"
using namespace std; int main ()
{
int i = ;
int a[]; LinkStack* stack = NULL;
stack = LinkStack_Create();
if(stack == NULL)
{
return -;
}
//入栈
for (i = ; i < ; i++)
{
a[i] = i + ;
LinkStack_Push(stack, &a[i]);
}
//显示大小和栈顶元素
cout << "Size: " << LinkStack_GetSize(stack) << endl; cout << "Top: " << *((int *)LinkStack_GetTop(stack)) << endl; //出栈
while(LinkStack_GetSize(stack) != )
{
cout << "Pop: " << *((int *)LinkStack_Pop(stack)) << endl;
}
//入栈
LinkStack_Push(stack, &a[]);
cout << "Size: " << LinkStack_GetSize(stack) << endl;
//清空
LinkStack_Clear(stack);
cout << "After Clear Size: " << LinkStack_GetSize(stack) << endl;
//删除一个栈
LinkStack_Destroy(stack); system("pause");
return ;
}

基于链式链表的栈链式存储的C风格实现的更多相关文章

  1. C 栈 链式存储

    #ifndef _MY_LINKSTACK_H_ #define _MY_LINKSTACK_H_ typedef void LinkStack; LinkStack* LinkStack_Creat ...

  2. Java安全之基于Tomcat的通用回显链

    Java安全之基于Tomcat的通用回显链 写在前面 首先看这篇文还是建议简单了解下Tomcat中的一些概念,不然看起来会比较吃力.其次是回顾下反射中有关Field类的一些操作. * Field[] ...

  3. Gumby – 基于 Sass 的灵活的,响应式 CSS 框架

    Gumby 框架是一个基于 SASS 的灵活的,响应式的 CSS 框架.可以借助其灵活,响应式的网格系统和 UI 套件快速创建逻辑的页面布局和应用程序原型. 您可能感兴趣的相关文章 35个让人惊讶的 ...

  4. NYOJ128 前缀式计算 【栈】

    前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 先说明一下什么是中缀式: 如2+(3+4)*5这样的我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上 ...

  5. 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二)

    基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二) 之前文章中给大家说明了下我这个小小的想法,发现还是有不少人的支持和关注.你们的鼓励是对我最大的支持. 我总结了了 ...

  6. C++侵入式链表

    C++标准模板库中的list是非侵入式的链表,当我们通过对象来删除容器中的对象时,需要从头到尾查找一次得到iterator,最后通过iterator来删除对象.这样删除容器中的对象时比较缓慢,所以就实 ...

  7. 基于java实现的简单区块链

    技术:maven3.0.5 + jdk1.8   概述 区块链是分布式数据存储.点对点传输.共识机制.加密算法等计算机技术的新型应用模式.所谓共识机制是区块链系统中实现不同节点之间建立信任.获取权益的 ...

  8. 转:区块链开发(一)搭建基于以太坊go-ethereum的私有链环境

    区块链开发(一)搭建基于以太坊go-ethereum的私有链环境 wo541075754 · 2016-11-07 13:00:03 · 3730 次点击 · 预计阅读时间 3 分钟 · 约1小时前  ...

  9. 基于bootstrup3全屏宽度的响应式jQuery幻灯片特效

    这是一款效果非常酷的基于Bootstrup3.x和HTML5的响应式全屏宽度jQuery幻灯片特效.该幻灯片能自适应屏幕的宽度,使用HTML5的data属性来指定幻灯片所需的各种属性.使用简单,界面美 ...

随机推荐

  1. 【bzoj1718】Redundant Paths 分离的路径

    1718: [Usaco2006 Jan] Redundant Paths 分离的路径 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 964  Solve ...

  2. ubuntu管理apt包的常用命令

    安装 apt-get install nginx #安装 apt-get install nginx --reinstall #重新安装 删除 apt-get remove nginx #卸载 apt ...

  3. spring security 5 There is no PasswordEncoder mapped for the id "null" 错误

    转载请注明出处 http://www.cnblogs.com/majianming/p/7923604.html 最近在学习spring security,但是在设置客户端密码时,一直出现了一下错误提 ...

  4. 当获取相似数据时,使用不同方法调用不同sp,但是使用同一个方法去用IIDataReader或者SqlDataReader读取数据时需要判断column name是否存在。

    /// <summary> /// Checks clumn Name /// </summary> /// <param name="reader" ...

  5. [转]SqlServer索引的原理与应用

    索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录 ...

  6. java 并发容器一之ConcurrentHashMap(基于JDK1.8)

    上一篇文章简单的写了一下,BoundedConcurrentHashMap,觉得https://www.cnblogs.com/qiaoyutao/p/10903813.html用的并不多:今天着重写 ...

  7. ycsb安装和使用介绍

    nosql性能测试工具ycsb0.1的使用 使用文档参考地址:https://www.cnblogs.com/SailorXiao/p/5808828.html ycsb地址:https://gith ...

  8. Android学习总结(十三) ———— ListView 简单用法

    一.ListView的基本概念 在Android所有常用的原生控件当中,用法最复杂的应该就是ListView了,它专门用于处理那种内容元素很多,手机屏幕无法展示出所有内容的情况.ListView可以使 ...

  9. python 相关编码[转]

    python 相关编码[转]   三篇文章,导航:(一)(二)(三) (一) 怎么避免UnicodeEncodeError: ‘ascii’ codec can’t…类似的错误? 1.首先在py文件头 ...

  10. codevs 1487 大批整数排序(水题日常)

     时间限制: 3 s  空间限制: 16000 KB  题目等级 : 黄金 Gold 题目描述 Description !!!CodeVS开发者有话说: codevs自从换了评测机,新评测机的内存计算 ...