栈的链式存储 - API实现
基本概念
其它概念详情參看前一篇博文:栈的顺序存储 - 设计与实现 - API实现
这里也是运用了链表的链式存储API高速实现了栈的API。
代码:
// linkstack.h
// 链式存储栈的API声明 #ifndef _MY_LINKSTACK_H_
#define _MY_LINKSTACK_H_ typedef void LinkStack; // 创建栈
LinkStack* LinkStack_Create(); // 销毁栈
void LinkStack_Destroy(LinkStack* stack); // 清空栈
void LinkStack_Clear(LinkStack* stack); // 将item入栈
int LinkStack_Push(LinkStack* stack, void* item); // 弹出栈顶元素
void* LinkStack_Pop(LinkStack* stack); // 获取栈顶元素
void* LinkStack_Top(LinkStack* stack); // 获取栈的大小
int LinkStack_Size(LinkStack* stack); #endif //_MY_LINKSTACK_H_
// linkstack.cpp
// 链式存储栈的API实现 #include <stdio.h>
#include <malloc.h>
#include "linkstack.h"
#include "linklist.h" typedef void LinkStack; typedef struct _tag_LinkStack
{
LinkListNode node;
void* item;
}TLinkStack; // 创建一个栈,相当于创建一个线性表
LinkStack* LinkStack_Create()
{
return LinkList_Create();
} // 销毁栈
void LinkStack_Destroy(LinkStack* stack)
{
LinkStack_Clear(stack); // 释放栈的结点
LinkList_Destroy(stack); // 释放句柄
return;
} // 清空栈
void LinkStack_Clear(LinkStack* stack)
{
while (LinkList_Length(stack)) {
LinkStack_Pop(stack);
}
return;
} // 向栈中加入元素,相当于用头插法向线性表加入结点
int LinkStack_Push(LinkStack* stack, void* item)
{
int ret = 0;
TLinkStack *tStack = NULL; // 把void* item转化成链表结点
tStack = (TLinkStack *)malloc(sizeof(TLinkStack));
tStack->item = item; // 头插法插入结点
ret = LinkList_Insert(stack, (LinkListNode *)tStack, 0);
if (ret) {
printf("function LinkStack_Push err: %d.\n", ret);
free(tStack);
return ret;
} return ret;
} // 弹出栈顶元素,相当于从线性表中删除0号元素
void* LinkStack_Pop(LinkStack* stack)
{
TLinkStack *tStack = NULL;
void* item = NULL; tStack = (TLinkStack *)LinkList_Delete(stack, 0);
if (tStack == NULL) {
printf("function LinkStack_Pop err.\n");
return NULL;
} // 把链表结点转化成栈结点
item = tStack->item;
free(tStack); // 记得释放创建时候malloc的内存 return item;
} // 获取栈顶元素
void* LinkStack_Top(LinkStack* stack)
{
TLinkStack *tStack = NULL;
void* item = NULL; tStack = (TLinkStack *)LinkList_Get(stack, 0);
if (tStack == NULL) {
printf("function LinkStack_Top err.\n");
return NULL;
} item = tStack->item; return item;
} // 获取栈的大小
int LinkStack_Size(LinkStack* stack)
{
return LinkList_Length(stack);
}
// main.cpp
// 栈链式存储的測试程序 #include <stdio.h>
#include "linkstack.h" const int maxn = 5; void play()
{
int a[maxn]; for (int i = 0; i < maxn; ++i) {
a[i] = i + 1;
} LinkStack *stack = NULL; stack = LinkStack_Create(); // 创建栈 // 入栈
for (int i = 0; i < maxn; ++i) {
LinkStack_Push(stack, &a[i]);
} // 栈属性
printf("size: %d\n", LinkStack_Size(stack));
printf("top: %d\n", *((int *)LinkStack_Top(stack))); LinkStack_Destroy(stack);
} int main()
{
play(); return 0;
}
// linklist.h
#ifndef _MYLINKLIST_H_
#define _MYLINKLIST_H_ typedef void LinkList; typedef struct _tag_LinkListNode
{
struct _tag_LinkListNode* next;
}LinkListNode; LinkList* LinkList_Create(); void LinkList_Destroy(LinkList* list); void LinkList_Clear(LinkList* list); int LinkList_Length(LinkList* list); int LinkList_Insert(LinkList* list, LinkListNode* node, int pos); LinkListNode* LinkList_Get(LinkList* list, int pos); LinkListNode* LinkList_Delete(LinkList* list, int pos); #endif
// linklist.cpp #include <iostream>
#include <cstdio>
#include "linklist.h" using namespace std; typedef void LinkList; typedef struct _tag_LinkList
{
LinkListNode header;
int length;
}TLinkList; LinkList* LinkList_Create()
{
TLinkList *tmp = NULL; tmp = (TLinkList *)malloc(sizeof(TLinkList));
if (tmp == NULL) {
printf("function LinkList_Create() err.\n");
return NULL;
}
memset(tmp, 0, sizeof(TLinkList)); // 初始化为空链表 return tmp;
} void LinkList_Destroy(LinkList* list)
{
if (list == NULL) {
return;
}
free(list); return;
} void LinkList_Clear(LinkList* list)
{
if (list == NULL) {
return;
}
TLinkList *tList = NULL;
tList = (TLinkList *)list;
tList->header.next = NULL;
tList->length = 0; return;
} int LinkList_Length(LinkList* list)
{
if (list == NULL) {
return -1;
}
TLinkList *tList = NULL;
tList = (TLinkList *)list; return tList->length;
} int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
{
if (list == NULL || node == NULL || pos < 0) {
return -1;
}
TLinkList *tList = NULL;
tList = (TLinkList *)list;
LinkListNode *cur = NULL;
cur = &(tList->header); // 对pos的容错处理。假设pos过大。改为最后面
if (pos > LinkList_Length(list)) {
pos = LinkList_Length(list);
} // 移动到须要插入的位置
for (int i = 0; i < pos; ++i) {
cur = cur->next;
} // 插入
node->next = cur->next;
cur->next = node; ++tList->length; return 0;
} LinkListNode* LinkList_Get(LinkList* list, int pos)
{
if (list == NULL || pos < 0 || pos >= LinkList_Length(list)) {
return NULL;
}
TLinkList *tList = NULL;
tList = (TLinkList *)list;
LinkListNode *cur = NULL;
cur = &(tList->header); for (int i = 0; i < pos; ++i) {
cur = cur->next;
} return cur->next;
} LinkListNode* LinkList_Delete(LinkList* list, int pos)
{
if (list == NULL || pos < 0 || pos >= LinkList_Length(list)) {
return NULL;
}
TLinkList *tList = NULL;
tList = (TLinkList *)list;
LinkListNode *cur = NULL;
cur = &(tList->header); for (int i = 0; i < pos; ++i) {
cur = cur->next;
} LinkListNode *ret = NULL;
ret = cur->next; // 删除结点
cur->next = ret->next; --tList->length; return ret;
}
project代码详情:Github
栈的链式存储 - API实现的更多相关文章
- C++编程练习(4)----“实现简单的栈的链式存储结构“
如果栈的使用过程中元素数目变化不可预测,有时很小,有时很大,则最好使用链栈:反之,如果它的变化在可控范围内,使用顺序栈会好一些. 简单的栈的链式存储结构代码如下: /*LinkStack.h*/ #i ...
- C语言- 基础数据结构和算法 - 栈的链式存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- C++_template_栈的链式存储及实现
由于在C++数据结构中的代码不完整,特补全.等日后当工程库调用. 若有疑问,请留言. #include<iostream> using namespace std; template< ...
- 栈(链式存储) C++模板实现
#include <iostream> using namespace std; //栈结点类 template <typename T> class stackNode{ p ...
- 栈的链式存储方法的C语言实现
/* 编译器:Dev-c++ 5.4.0 文件名:linkStack.cpp 代码版本号:1.0 时间:2015年10月15日18:56:06 */ #include <stdio.h> ...
- Java数据结构系列之——栈(2):栈的链式存储结构及其操作
package Stack; import LinkList.SinglyLinkList; public class LinkListStack { private SinglyLinkList&l ...
- 队列链式存储 - 设计与实现 - API函数
队列相关基础内容参我的博文:队列顺序存储 - 设计与实现 - API函数 队列也是一种特殊的线性表:可以用线性表链式存储来模拟队列的链式存储. 主要代码: // linkqueue.h // 队列链式 ...
- 【Java】 大话数据结构(6) 栈的顺序与链式存储
本文根据<大话数据结构>一书,实现了Java版的栈的顺序存储结构.两栈共享空间.栈的链式存储机构. 栈:限定仅在表尾进行插入和删除操作的线性表. 栈的插入(进栈)和删除(出栈)操作如下图所 ...
- 栈的顺序存储和链式存储c语言实现
一. 栈 栈的定义:栈是只允许在一端进行插入或删除操作的线性表. 1.栈的顺序存储 栈顶指针:S.top,初始设为-1 栈顶元素:S.data[S.top] 进栈操作:栈不满时,栈顶指针先加1,再到栈 ...
随机推荐
- 11-18的学习总结(DOMSecondday)
DOM:读取访问节点对象属性 批量删除父元素下所有子节点 elem.innerHTML=""; 批量替换父元素下所有子节点 elem.innerHTML="所有子元素标签 ...
- Android Activity与Service的交互方式
参考: http://blog.csdn.net/gebitan505/article/details/18151203 实现更新下载进度的功能 1. 通过广播交互 Server端将目前的下载进度,通 ...
- phpcms v9指定栏目调用系列教程
调用指定栏目名称: {$CATEGORYS[栏目ID]['catname']} 调用指定栏目url {$CATEGORYS[栏目ID]['url']} 调用指定栏目栏目图片 {$CATEGORYS[栏 ...
- Mac os 10.9下面配置JAVA_HOME
刚入手的的MBP,就开始配置java环境,搜了一下网上的都是10.9以前的配置方法.jdk7在10.9的安装目录变化了. 首先到Oracle官网下载最新版本的java,直接默认安装 cd /etc s ...
- theano中的logisticregression代码学习
1 class LogisticRegression (object): 2 def __int__(self,...): 3 4 #定义一些与逻辑回归相关的各种函数 5 6 def method1( ...
- Linux内核监控模块-1-驱动模块(LKM)开发(以一个简单的hello world程序为例)
在上面一篇中介绍到,监控模块要做成一个驱动模块(或者说是可加载模块,LKM),动态的加载到Linux内核中.那么这篇就简单的介绍一下怎样做一个这样的驱动模块. 以简单的hello world程序为 ...
- 【itext】7步制作兼容各种文档格式的Itext5页眉页脚 实现page x pf y
itext5页眉页脚工具类,实现page x of y 完美兼容各种格式大小文档A4/B5/B3,兼容各种文档格式自动计算页脚XY轴坐标 鉴于没人做的这么细致,自己就写了一个itext5页眉页脚工具类 ...
- A simple brute force problem.
hdu4971:http://acm.hdu.edu.cn/showproblem.php?pid=4971 题意:给你n个项目,每完成一个项目会有一定的收益,但是为了完成某个项目,要先学会一些技能, ...
- 【HDOJ】1829 A Bug's Life
并查集变型.题意就是x与y是互斥的,下列是否数据是否可保证x-y是否均为互斥. #include <cstdio> #include <cstring> #define MAX ...
- 纯css切换左侧菜单
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...