链式链表的头文件与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. morphia(1)-基础

    二.Mapping classes entity类上加注解:@Entity,其成员变量必须有@Id @Id private ObjectId id; 其在mongodb中变量名: _id @Embed ...

  2. EDAS提交论文字体未嵌入

    一.深夜更一波,刚刚在EDAS提交论文,提示格式不通过,说我有字体未嵌入.但是之前一直都没有问题,这次只是在LaTeX中嵌图的时候把eps换成PDF了.所以问题应该是出在我的PDF图里,里面有字体未被 ...

  3. yii2 使用gii生成代码文件

    访问地址: http://localhost/yii2-test/web/index.php?r=gii  如果你通过本机以外的机器访问 Gii,请求会被出于安全原因拒绝. 在web.php修改gii ...

  4. SpringBoot整合国际化I18n

    本文主要实现的功能: 从文件夹中直接加载多个国际化文件 后台设置前端页面显示国际化信息的文件 实现 国际化项目初始化,简单看下项目的目录和文件 在resource下创建国际化文件 messages.p ...

  5. Android Studio你必须学会的快捷键(Eclipse转AS必看)

    前言:从Eclipse转到Android Studio之后,一开始把keymap设置成Eclipse,却发现有些常用的快捷键都失效了,大概是冲突了.想了下,觉得与其重新设置快捷键,不如去适应AS的快捷 ...

  6. MySQL备份还原介绍

    window系统下 1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u dbuser -p dbname > dbname.sql ...

  7. InitialContext与lookup

    Context initial = new InitialContext(); Object objref = initial.lookup("java:comp/env/ejb/Simpl ...

  8. 系统妈Ghost Win10 64位快速安装版 V2016年2月

    系统妈Ghost win10 64位快速安装版 V2016年2月,更新了最新系统补丁,升级系统版本号为2016年2月份.这款累积更新补丁会取代之前的版本.本系统还附带最常用的装机必备软件.QQ等. 系 ...

  9. (十一)mybatis之映射器(select)

    映射器 映射器的主要元素有八种: 元素名称 描述 select 查询语句,可自定义参数 insert 插入语句,执行后返回插入的条数 update 更新语句,执行后返回更新的条数 delete 删除语 ...

  10. UIButton 左对齐 省略号最右边

    //左对齐 [_btn setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft]; //省略号靠右侧 _btn.ti ...