linkStack 实现

底层调用的是linkList来实现linkStack。

由于linkList是通过linkListNode来串联起来的,而linkStack没有linkListNode结构体,因此需要定义一个结构体来满足linkList的要求,这个过程叫做适配。

注意内存的分配和释放,这也是C++赋予程序员的灵活。

#ifndef LINKSTACK_H_INCLUDED
#define LINKSTACK_H_INCLUDED

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_Top(linkStack* stack);

int linkStack_Size(linkStack* stack);

#endif // LINKSTACK_H_INCLUDED
#include "linkStack.h"
#include "linkList.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef void linkStack;

typedef struct _stackNode
{
    linkListNode node;
    void * item;
}stackNode;

linkStack* linkStack_Create()
{
    return Creat();
}

void linkStack_Destroy(linkStack* stack)
{
    linkStack_Clear(stack);
    Destroy(stack);
}

void linkStack_Clear(linkStack* stack)
{
    while(Length(stack) > 0)
    {
        linkStack_Pop(stack);
    }
}

int linkStack_Push(linkStack* stack, void* item)
{
    stackNode *tmp = (stackNode*)malloc(sizeof(stackNode));
    tmp->item = item;
    int ret =  Insert(stack, (linkListNode*)tmp, 0);
    if(ret!=0)
    {
        printf("linkStack_Push malloc failed!\n");
        free(tmp);
    }
    return ret;

}

void* linkStack_Pop(linkStack* stack)
{
    stackNode *tmp = (stackNode*)Delete(stack, 0);
    if(tmp==NULL)
        return NULL;
    void *ret = tmp->item;
    free(tmp);
    return ret;

}

void* linkStack_Top(linkStack* stack)
{
     stackNode* tmp = (stackNode*)Get(stack,0);
     return tmp->item;
}

int linkStack_Size(linkStack* stack)
{
    return Length(stack);
}

原文地址:https://www.cnblogs.com/randyniu/p/9175075.html

时间: 2024-10-05 02:21:49

linkStack 实现的相关文章

LinkStack

#include <iostream> using namespace std; template <class T> class Node { public: T data; Node *next; Node () { } Node (T d, Node *p): data(d), next(p) { } }; template <class T> class LinkStack { private: Node<T> *top; public: LinkS

栈的的链式实例LinkStack实现

1.#include <stdio.h>#include <malloc.h>#include "LinkList.h" typedef struct _tag_LinkList{    LinkListNode header;    int length;} TLinkList; LinkList* LinkList_Create() // O(1){    TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkLis

链栈的实现

链栈即链式栈,也就是说我们不用再考虑空间的大小,可随心所欲的进行数据的插入/删除了.和顺序栈一样,仍然要保持其stack的特性,只在一端进行插入和删除,后进先出. 示例代码: #ifndef _LINKSTACK_H #define _LINKSTACK_H typedef int ElemType; typedef int Status; typedef struct linkStack { ElemType data; struct linkStack * top; }linkStack;

堆栈(链栈)

#include<cstdlib> #include<iostream> #include<fstream> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef char SElemType; typedef struct StackNode{ SElemType data; struct StackNode *next; }S

数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树 二叉树的创建,关系建立 二叉树的创建,关系建立2 三叉链表法 双亲链表: 二叉树的遍历 遍历的分析PPT 计算二叉树中叶子节点的数目:使用全局变量计数器 计算二叉树中叶子节点的数目:不使用全局变量计数器 无论是先序遍历,中序遍历,后序遍历,求叶子的数字都不变;因为本质都是一样的,任何一个节点都会遍历3趟 求二叉树的高度 二叉树的拷

数据结构Java实现05----栈:顺序栈和链式堆栈

数据结构Java实现05----栈:顺序栈和链式堆栈 一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作. 先进后出:堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底.堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈. 备注:栈本身就是一个线性表,所以我们之前讨论过线性表的顺序存储和链式存储,对于栈来说,同样适

数据结构之栈和队列

数据结构学习继续向前推进,之前对线性表进行了学习,现在我们进入栈和队列的学习.同样我们先学习一些基本概念以及堆栈的ADT. 栈和队列是两种中重要的线性结构.从数据结构角度看,栈和队列也是线性表,只不过是受限的线性表.因此可以称为限定性数据结构.但从数据类型来看,他们是和线性表大不相同的两类重要的抽象数据类型. 栈:(stack)是限定仅在表尾进行相应插入和删除操作的线性表.因此,对栈来说,表尾有其特殊含义,称为栈顶,表头称为栈底,不含元素的空表称为空栈.栈一个重要特性就是后进先出.OK,我们来看

栈的实现

栈的实现: 栈,仅限制在栈的一端进行插入和删除,用于插入与删除的一端为顶部.另一端为底端. 栈,定义为先进后出. 可以看到 插入以a1,a2,a3顺序进行,而删除以an ,an-1顺序进行 同样栈的实现也分为数组实现以及链式实现两种. 首先来介绍一下顺序实现 优点:顺序实现的出栈和入栈的执行速度会更加的快. 缺点:顺序实现的元素数量是有限的. 代码实现: public class Stack { private Node stack[]; int top = 0; Stack(){ stack

栈的链式存储结构和入栈出栈操作

参考<大话数据结构>P98~99——栈的链式存储结构. 进栈: 出栈: 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 typedef string status;//用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便 6 7 //栈的结点 8 //包含data,和指向下一个结点