链式链表的头文件与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. 547 Friend Circles 朋友圈

    班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递性.如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友.所谓的朋友圈,是指所有朋友的集合.给 ...

  2. 《深入理解java虚拟机》笔记(1)运行时数据区域

    1.Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. 2.运行时数据区域划分 java虚拟机在执行java程序的过程中会把它所管理的内存划 ...

  3. gin 打linux环境包问题解决

    打window包直接go build一下,完事, 但是,打linux包出现如下错误 ..\github.com\mattn\go-isatty\isatty_linux.go:7:8: cannot ...

  4. CF1072B Curiosity Has No Limits

    思路: 对于序列t,只要第一个数确定了,后续的数也随之确定了.枚举四种情况即可.实现: #include <iostream> #include <vector> using ...

  5. substring()和substr()的使用以及区别

    在JavaScript中,通常会用到截取,那所谓截取呢,其实就是要获得被截取元素的某个位置到某个位置的内容,那么JS给我提供了substring和substr这两种方法: 这两种截取的方式有什么区别呢 ...

  6. sql中的exsits和not exsits

    select * from table where exsits(sql语句) :  括号中sql语句有数据则返回这些相关id的数据集 select * from table where not ex ...

  7. codevs 1267 老鼠的旅行 2012年CCC加拿大高中生信息学奥赛

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description You are a mouse that lives in a cage in ...

  8. shell脚本,awk常见初始化变量的题目。

    文件 内容如下 clone=line1gb=line1gi=line1lib=line1gb=line2gi=line2lib=line2clone=line3gb=line3gi=line3lib= ...

  9. shell脚本,怎么实现每次新开一个shell都输出一个提示语?

    [root@localhost wyb]# cat test.sh echo -e "\033[32mhello,This is wangyuebo's shell\033[0m" ...

  10. java面试宝典第四弹

    动态代理 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道背后的厂家究竟是谁,也就是说,“委托者” ...