基于链式链表的栈链式存储的C风格实现
链式链表的头文件与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风格实现的更多相关文章
- C 栈 链式存储
#ifndef _MY_LINKSTACK_H_ #define _MY_LINKSTACK_H_ typedef void LinkStack; LinkStack* LinkStack_Creat ...
- Java安全之基于Tomcat的通用回显链
Java安全之基于Tomcat的通用回显链 写在前面 首先看这篇文还是建议简单了解下Tomcat中的一些概念,不然看起来会比较吃力.其次是回顾下反射中有关Field类的一些操作. * Field[] ...
- Gumby – 基于 Sass 的灵活的,响应式 CSS 框架
Gumby 框架是一个基于 SASS 的灵活的,响应式的 CSS 框架.可以借助其灵活,响应式的网格系统和 UI 套件快速创建逻辑的页面布局和应用程序原型. 您可能感兴趣的相关文章 35个让人惊讶的 ...
- NYOJ128 前缀式计算 【栈】
前缀式计算 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 先说明一下什么是中缀式: 如2+(3+4)*5这样的我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上 ...
- 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二)
基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二) 之前文章中给大家说明了下我这个小小的想法,发现还是有不少人的支持和关注.你们的鼓励是对我最大的支持. 我总结了了 ...
- C++侵入式链表
C++标准模板库中的list是非侵入式的链表,当我们通过对象来删除容器中的对象时,需要从头到尾查找一次得到iterator,最后通过iterator来删除对象.这样删除容器中的对象时比较缓慢,所以就实 ...
- 基于java实现的简单区块链
技术:maven3.0.5 + jdk1.8 概述 区块链是分布式数据存储.点对点传输.共识机制.加密算法等计算机技术的新型应用模式.所谓共识机制是区块链系统中实现不同节点之间建立信任.获取权益的 ...
- 转:区块链开发(一)搭建基于以太坊go-ethereum的私有链环境
区块链开发(一)搭建基于以太坊go-ethereum的私有链环境 wo541075754 · 2016-11-07 13:00:03 · 3730 次点击 · 预计阅读时间 3 分钟 · 约1小时前 ...
- 基于bootstrup3全屏宽度的响应式jQuery幻灯片特效
这是一款效果非常酷的基于Bootstrup3.x和HTML5的响应式全屏宽度jQuery幻灯片特效.该幻灯片能自适应屏幕的宽度,使用HTML5的data属性来指定幻灯片所需的各种属性.使用简单,界面美 ...
随机推荐
- Panoramic Photography
http://codeforces.com/gym/101149/problem/J 给出n个数字,表示第i条街有a[i]个照片存在过,其中,每个照片可以覆盖一段连续的区间, 就是一张照片可以覆盖[2 ...
- Unity Shader入门精要学习笔记 - 第15章 使用噪声
转载自 冯乐乐的 <Unity Shader 入门精要> 消融效果 消融效果常见于游戏中的角色死亡.地图烧毁等效果.这这些效果中,消融往往从不同的区域开始,并向看似随机的方向扩张,最后整个 ...
- AQS及其前置知识总结
CLH队列锁 及自旋锁 乐观锁及CAS 独占锁与共享锁 LockSupport与wait ,join和notify 这里截取内部类Node的部分代码,节点的状态值如下: /** waitStatus ...
- java maven cxf笔记
IDE: 一:新建Maven项目 1.File->New->Project.. 2. 3. 4. 二:添加cxf和jetty依赖 <dependencies> <!- ...
- IE浏览器兼容background-size
background-size是CSS3新增的属性,IE8以下不支持,通过滤镜实现background-size效果 background-size:contain; // 缩小图片来适应元素的尺寸( ...
- VC运行时库(/MD、/MT等)
VC项目属性→配置属性→C/C++→代码生成→运行时库 可以采用的方式有:多线程(/MT).多线程调试(/MTd).多线程DLL(/MD).多线程调试DLL(/MDd).单线程(/ML).单线程调试( ...
- iOS 自适应高度,改变字体颜色
#define kMainBoundsWidth ([UIScreen mainScreen].bounds).size.width //屏幕的宽度 #define kFont [UIFont sys ...
- IOS生成UUID
/** * 生成GUID */ + (NSString *)generateUuidString{ // create a new UUID which you own CFUUIDRef uuid ...
- 洛谷 P1996 约瑟夫问题
题目背景 约瑟夫是一个无聊的人!!! 题目描述 n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出 ...
- GNU make(2)
GNU make(2) 参考: GNU Make学习总结(二) 变量 变量由一个前导符号$加上字符或者是括号字符组成, 名称区分大小写. 命名: 习惯上用全部大写字符表示常量, 小写字符表示变量, 单 ...