基于链式链表的栈链式存储的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 ...
- 牛客网Java刷题知识点之Iterator和ListIterator的区别
不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?query=&asc=true&order=&page=21 ...
- Storm编程入门API系列之Storm的Topology多个Workers数目控制实现
前期博客 Storm编程入门API系列之Storm的Topology默认Workers.默认executors和默认tasks数目 继续编写 StormTopologyMoreWorker.java ...
- nodejs express 设置html后缀模板
express 框架的默认渲染模板的后缀是 ejs ,由于编译器在ejs的文件里写html代码没有高亮显示,所以使用html模板. 示例: var app = express(); app.set(' ...
- sqlite的应用
对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取.下面就向大家介绍一下SQLite常用的操作方法.本篇文章主要用到SQLiteDataba ...
- Node.js 打造实时多人游戏框架
在 Node.js 如火如荼发展的今天,我们已经可以用它来做各种各样的事情.前段时间UP主参加了极客松活动,在这次活动中我们意在做出一款让“低头族”能够更多交流的游戏,核心功能便是 Lan Party ...
- Azure 8 月新公布
Azure 8 月新发布:Cosmos DB 每分钟请求单位,存储的托管磁盘及促销,高级和标准磁盘存储大尺寸磁盘,高级磁盘存储小尺寸磁盘. Azure Cosmos DB:每分钟请求单位为您降低成本, ...
- 华硕笔记本刷BIOS
笔记本硬件升级后想使用微软的Windows xp mode,之后发现笔记本BIOS中没有虚拟化选项,想通过升级BIOS的方法来解决,结果失败. 升级后出现关机后无法关闭电源指示灯以及风扇的问题,之后只 ...
- Longest Increasing Subsequence的两种算法
问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7-.an,求它的一个子序列(设为s1,s2,-sn),使得这个子序列满足这样的性质,s1<s2<s3<-<sn并且 ...
- SAP CRM中间件下载equipment时遇到的一个错误
在CRM开发系统上进行equipment下载,发现不工作.调试发现错误信息在下图定96行的WHEN default分支抛出的: MESSAGE ID 'AZ' ... 通过阅读源代码发现,ERP端支持 ...