基本概念

其它概念详情參看前一篇博文:栈的顺序存储 - 设计与实现 - 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实现的更多相关文章

  1. C++编程练习(4)----“实现简单的栈的链式存储结构“

    如果栈的使用过程中元素数目变化不可预测,有时很小,有时很大,则最好使用链栈:反之,如果它的变化在可控范围内,使用顺序栈会好一些. 简单的栈的链式存储结构代码如下: /*LinkStack.h*/ #i ...

  2. C语言- 基础数据结构和算法 - 栈的链式存储

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  3. C++_template_栈的链式存储及实现

    由于在C++数据结构中的代码不完整,特补全.等日后当工程库调用. 若有疑问,请留言. #include<iostream> using namespace std; template< ...

  4. 栈(链式存储) C++模板实现

    #include <iostream> using namespace std; //栈结点类 template <typename T> class stackNode{ p ...

  5. 栈的链式存储方法的C语言实现

    /* 编译器:Dev-c++ 5.4.0 文件名:linkStack.cpp 代码版本号:1.0 时间:2015年10月15日18:56:06 */ #include <stdio.h> ...

  6. Java数据结构系列之——栈(2):栈的链式存储结构及其操作

    package Stack; import LinkList.SinglyLinkList; public class LinkListStack { private SinglyLinkList&l ...

  7. 队列链式存储 - 设计与实现 - API函数

    队列相关基础内容参我的博文:队列顺序存储 - 设计与实现 - API函数 队列也是一种特殊的线性表:可以用线性表链式存储来模拟队列的链式存储. 主要代码: // linkqueue.h // 队列链式 ...

  8. 【Java】 大话数据结构(6) 栈的顺序与链式存储

    本文根据<大话数据结构>一书,实现了Java版的栈的顺序存储结构.两栈共享空间.栈的链式存储机构. 栈:限定仅在表尾进行插入和删除操作的线性表. 栈的插入(进栈)和删除(出栈)操作如下图所 ...

  9. 栈的顺序存储和链式存储c语言实现

    一. 栈 栈的定义:栈是只允许在一端进行插入或删除操作的线性表. 1.栈的顺序存储 栈顶指针:S.top,初始设为-1 栈顶元素:S.data[S.top] 进栈操作:栈不满时,栈顶指针先加1,再到栈 ...

随机推荐

  1. js获取时间天数

    date2必须大于date1 function getDays(date1,date2){ /*获取之间的天数*/ /*date1,date2都是date格式*/ var getd=(date2.ge ...

  2. 机器学习系列(17)_Yelper推荐系统

     1. 我们为什么需要推荐系统?“推荐”可是个当红话题.Netflix愿意用百万美金召求最佳的电影推荐算法,Facebook也为了登陆时的推荐服务开发了上百个项目,遑论现在市场上各式各样的应用都需要个 ...

  3. Android Vibrator系统分析

    Vibrator系统的层次结构

  4. uboot环境变量区为何不能放在data段

    一.疑问 环境变量也是全局变量,为何不能像其他的全局变量放在data段呢?为什么要放在堆中或者使用ENV_IS_EMBEDDED定义的CFG_ENV_SIZE的空间大小,又为什么需要这么大的空间呢? ...

  5. 通过阅读ASP.NET MVC5 框架解密 路由的一点心得

    路由: 1.在ASP.NET中路由不专属与ASP.NET MVC,因为路由(Route)是在system.web 命名空间下的,所以传统的WebForm也可以使用路由. 2.什么叫做路由 采用某种机制 ...

  6. Bridage

    对于有两个以上的维度的对象,如下图:这张图的业务逻辑是这样的,Hayes,USR以及Emie都是上网的猫,现在有两条线路,一条是传统Dial,还有一条线路是专线,不需要拨号,这样每创建一种线路就意味着 ...

  7. js烟花特效

    <!DOCTYPE html><html><head><style>body{background:#000;margin:0;}canvas{curs ...

  8. Hust 1231 Coin

    题目链接 题意: 亮亮有N个有瑕疵的硬币,有瑕疵意味着抛一枚硬币正面向上的概率 不等于 反面向上的概率 也即概率不等于0.5. 现在亮亮一次抛N个硬币 , 恰好有K个硬币正面向上 ,接着他又想抛一次 ...

  9. 掌握C++基础

    以下是笔者在ubuntu系统下编译运行通过的一些反应c++基础特性的例子,包括类,结构体,构造函数,析构函数,函数的重载,this指针,类的继承,虚函数,函数的覆盖和隐藏等.(由于格式问题代码中的乱码 ...

  10. 初识Vim

    在Windows系统安装Vim后桌面上会添加gVim.gVim Easy.gVim Read-only 三个快捷方式. gVim 指向主程序,gVim Easy.gVim Read-only 也是,但 ...