基本概念

其它概念详情參看前一篇博文:栈的顺序存储 - 设计与实现 - 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. SVN遇到Can't convert string from 'UTF-8' to native encoding

    刚配好mysql,svn co代码的时候遇到问题 svn: Can't convert string from 'UTF-8' to native encoding: svn: platform/co ...

  2. oracle系列索引

    今天终于把oracle入门的知识通篇过了一遍. 一篇文章没有写,先做个索引.把知识系统的梳理下. 数据库基本概念-oracle介绍 oracle安装,配置,启动 oracle工具 sqlplus 用户 ...

  3. memcached在windows安装

    下载地址: http://s3.amazonaws.com/downloads.northscale.com/memcached-win64-1.4.4-14.ziphttp://s3.amazona ...

  4. 黑马程序员——vim编辑器的使用

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.基本操作 1.从命令提示符进入vim编辑器:   vim filename <ENTE ...

  5. MVC OR API的接口

    MVC OR WEBAPI的接口安全 当我们开发一款App的时候,App需要跟后台服务进行通信获取或者提交数据.如果我们没有完善的安全机制则很容易被别用心的人伪造请求而篡改数据.所以我们需要使用某种安 ...

  6. nutch 1.7 导入 eclipse

    开发环境建议:ubuntu+eclipse (windows + cygwin + eclipse不推荐) 第一步:下载http://archive.apache.org/dist/nutch/从上述 ...

  7. python获取本地ip地址的方法

    #_*_coding:utf8_*_ #以下两种方法可以在ubuntu下或者windows下获得本地的IP地址 import socket # 方法一 localIP = socket.gethost ...

  8. Java Servlet的request使用的编码引发的思考 以及解决方法

    如果我们用浏览器填写了中文,而在服务器Servlet上没有进行编码设置,那么将会出现乱码. 出现乱码的原因是:浏览器发送的文字是以UTF-8编码发送的,然后调用request.getParameter ...

  9. 【POJ1082】Calendar Game (博弈)

    [题目] Description Adam and Eve enter this year's ACM International Collegiate Programming Contest. La ...

  10. 修改窗口属性(全部都是SetWindowLong设置)

    说明: 以下函数对于POPUP窗口有效,对于子窗口好像不行. //最小化按钮有效 ::SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_S ...