链式栈的表示和实现

表示

typedef struct node_t {

    data_t        data;
    struct node_t    *next;

} linknode_t, *linkstack_t;

实现

//创建
linkstack_t CreateEmptyLinkstack(void)
{
    linkstack_t stack;
    stack = (linkstack_t)malloc(sizeof(linknode_t));
    if (NULL != stack)
        stack->next = NULL;
    return stack;
}
//清空
int ClearLinkstack(linkstack_t stack)
{
    linknode_t *node;
    if (NULL != stack) {
        while (NULL != stack->next) {
            node = stack->next;
            stack->next = node->next;
            free(node);
        }
        return 0;
    } else {
        return -1;
    }
}
//销毁
int DestroyLinkstack(linkstack_t stack)
{
    if (NULL != stack) {
        ClearLinkstack(stack);
        free(stack);
    } else {
        return -1;
    }
}
//是否为空
int EmptyLinkstack(linkstack_t stack)
{
    if (NULL == stack) return -1;

    if (NULL != stack->next) {
        return 0;
    } else {
        return 1;
    }
}
//压栈
int PushStack(linkstack_t stack, data_t x)
{
    if (NULL == stack) return -1;

    linknode_t *stack_new;
    stack_new = (linkstack_t)malloc(sizeof(linknode_t));
    if (NULL == stack_new) return -1;
    stack_new->data = x;

    stack_new->next = stack->next;
    stack->next = stack_new;
    return 0;
}
//出栈
int PopStack(linkstack_t stack, data_t *x)
{
    if (NULL == stack) return -1;
    if (NULL == stack->next) return -1;

    linknode_t *node;
    node = stack->next;
    stack->next = node->next;
    if (NULL != x)
        *x = node->data;
    free(node);
    return 0;

}

测试代码

int Push_Pop(linkstack_t stack, data_t x);

/*
 * iterate through the stack, from the top to the base
 * and print out info of each element
 */
void iterate_stack(linkstack_t stack)
{
    linknode_t *node; /* pointer to the node to be iterated */

    if (NULL == stack) return;

    printf("stack = top{");

    node = stack->next;
    while (NULL != node) {
        printf("%d->", node->data);
        node = node->next;
    }

    if (1 == EmptyLinkstack(stack))
        printf("}base\n");
    else
        printf("\b\b}base\n");
}

int main(int argc, char *argv[])
{
    linkstack_t stack;

    if (argc < 2) {
        printf("Usage: %s <len>\n", argv[0]);
        return -1;
    }

    max_depth = atoi(argv[1]);

    stack = CreateEmptyLinkstack();

    if (NULL == stack) {
        printf("CreateEmptyLinkstack error\n");
        return -1;
    }

    Push_Pop(stack, 1);

    DestroyLinkstack(stack);

    return 0;
}

int Push_Pop(linkstack_t stack, data_t x)
{
    data_t data_pop;
    static int    depth = 0;    

    if (depth == max_depth) {
        printf("----- reach the max depth of the stack!\n");
        return 0;
    } else {
        depth++;

        printf("Push %d\n", x);
        PushStack(stack, x++);
        iterate_stack(stack);

        Push_Pop(stack, x);

        PopStack(stack, &data_pop);
        printf("Pop %d\n", data_pop);
        iterate_stack(stack);

        return -1;
    }
}

结果 ./a.out 8

Push 1
stack = top{1}base
Push 2
stack = top{2->1}base
Push 3
stack = top{3->2->1}base
Push 4
stack = top{4->3->2->1}base
Push 5
stack = top{5->4->3->2->1}base
Push 6
stack = top{6->5->4->3->2->1}base
Push 7
stack = top{7->6->5->4->3->2->1}base
Push 8
stack = top{8->7->6->5->4->3->2->1}base
----- reach the max depth of the stack!
Pop 8
stack = top{7->6->5->4->3->2->1}base
Pop 7
stack = top{6->5->4->3->2->1}base
Pop 6
stack = top{5->4->3->2->1}base
Pop 5
stack = top{4->3->2->1}base
Pop 4
stack = top{3->2->1}base
Pop 3
stack = top{2->1}base
Pop 2
stack = top{1}base
Pop 1
stack = top{}base
时间: 2024-09-29 10:33:53

链式栈的表示和实现的相关文章

链式栈

 1.编写头文件 #define datatype int struct statcknode { int num;                 //编号 datatype data;           //数据 struct statcknode *pNext;//指针域 }; typedef struct statcknode StackNode; //初始化 StackNode * init(StackNode *pHead); //进栈 StackNode * push(Sta

C++__链式栈(练习)

链式栈 stack.h #ifndef STACK_H_ #define STACK_H_ typedef int data_type; enum STACK_OP { STACK_ERR = -1, STACK_OK, STACK_EMPTY }; class STACK { private: data_type data; STACK *next; public: STACK(); STACK(data_type data); ~STACK(); data_type getData() co

C++链式栈

LinkStack: //链式栈 #include<iostream> using namespace std; typedef int elemType; typedef struct StackNode { elemType data; StackNode *next; }*LinkList; struct LinkStack { LinkList top; int count; }; //初始化 void InitStack(LinkStack *S) { S->top = NUL

链式栈的实现

链表实现的栈,在想象栈的时候,最好把他竖着想象成一个立着的容器. 然后往里面一个一个的加节点: 1.先加入top节点 2.然后再在top节点上加入node1节点,node1节点指向top节点 3.再在node1节点上加入node2节点,node2节点指向node1节点 .......... 下面描述用java实现链式栈的代码: Stack.java          链式栈的接口 1 package com.yeyan.linkstack; 2 /** 3 * 链式栈的接口 4 * @autho

链式栈总结

基本数据结构之—链式栈 链式栈-其实简单的理解就是一个受到操作限制的单向链表,因为栈只有简单的一些操作,比如:入栈,出栈,获取栈顶,栈的清空等 先分析一下栈的基本数据吧 栈作为一种容器,那么需要存储数据的地方,为了方便,只存储数据的开始地址是一个不错的选择 为了快速的知道栈的长度,我们在维护一个长度的参数,和顺序栈的区别是我们不用考虑容量的问题 当然你也可以维护更多的参数来支持你想要的操作. 栈的链式存储,底部使用的是链表的知识.为了方便操作和提升性能,我们将链表的头结点当做栈顶. 为了有个统一

数据结构基础(13) --链式栈的设计与实现

采用链式存储的栈成为链式栈(或简称链栈), 链栈的优点是便于多个栈共享存储空间和提高其效率, 且不存在栈满上溢的情况(因为链栈是靠指针链接到一起,只要内存够大, 则链栈理论上可以存储的元素是没有上限的); 与顺序栈相比, 由于顺序栈是采用的数组实现, 因此一旦数组填满, 则必须重新申请内存, 并将所有元素"搬家", 而链栈则省略了这一"耗时耗力"的工作, 但却需要付出附加一个指针的代价; 链栈通常采用单链表实现, 并规定所有的操作都必须实在单链表的表头进行, 而且w

[数据结构]栈之链式栈的类模板实现

栈的抽象基类的实现:(不用抽象基类也是可以的,为了使用虚函数方便) #ifndef STACK #define STACK //栈的抽象基类 template<class T> class Stack { public: Stack(){} ~Stack(){} virtual void Push(const T& x)=0; virtual bool Pop(T& x)=0; virtual bool getTop(T& x)const=0; virtual bool

C++实现链式栈,运用模板,界面友好,操作方便,运行流畅

//.h文件 #ifndef STACK_H #define STACK_H #include<iostream> #include<iomanip> using namespace std; template<typename T> //链式栈结点 struct L_Node { T data; L_Node<T>* next; L_Node(); L_Node(const T&item,L_Node<T>* next=NULL); /

栈的实现:链式栈

栈的链式存储,即链式栈.它相比于顺序栈, 优点: 插入.删除灵活 (不必移动节点,只要改变节点中的指针指向即可). 逻辑上相邻的节点物理上不必相邻. 缺点: 比顺序存储结构的存储密度小 (每个节点都由值域和链域组成,使用指针来表现前后节点的逻辑关系). 查找节点时链式存储要比顺序存储慢. 这些优点.缺点体现了顺序存储和链式存储的相区别之处. 看图就很形象了: 下面来看一个链式栈的实现: 类定义和类实现 #include<iostream> using namespace std; typede

Java的顺序栈和链式栈

栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出pop操作,每次删除的都是栈顶最新的元素:每次插入(又称"进栈")称为压入push操作. 当栈满的时候,进行push 操作,会上溢,当空栈的时候进行退栈操作的时称为下溢. 上溢是一种出错的情况,下溢可能是正常的情况处理. 堆栈的运算是按照后进先出的原则,简称LIFO. 栈的基本运算定义: i