美文网首页
C 链表实现栈

C 链表实现栈

作者: Void_Caller | 来源:发表于2019-07-27 16:13 被阅读0次

前言

第一次学数据结构,代码写的可能不是很好,大神勿喷,指出来就行。

读本文之前建议先学下链表

栈(zhan, 第四声)

栈(stack)是很基本的数据结构。
可以这么理解,可以看作为一个筒状有弹簧的储钱罐,你把一枚硬币压进去就相当于入栈的操作,但是压入很多硬币之后,你也只能一个个得取出,这个过程就是十分基本的栈操作了。

下表便是一个简单的栈:

栈顶元素 n
元素 n-1
元素 n-2
……
元素 2
元素 1
栈底元素 0

操作

函数 操作
push() 向栈顶添加元素
pop() 移除栈顶的元素
top() 读取栈顶的元素
size() 栈元素的数量
empty() 看栈是否为空
图解push()
图解pop()

有了这些预备只是便可以用C语言来实现简单的栈了。

C语言用链表的简单实现(大神勿喷)

#include <stdio.h>
#include <stdlib.h>

// 每个节点
struct Node
{
    int data; // 数据
    struct Node *pNext; // 下一个数据的指针
};

// 栈结构体
struct Stack
{
    struct Node *pNode; // 当前元素的指针
    int size; // 数量
};

// Operations

// 读取栈顶的元素
int top(struct Stack s)
{
    return (s.pNode) -> data;
}

// 向栈顶压入新的元素
int push(int data,struct Stack *s)
{
    struct Node *n = (struct Node*) malloc(sizeof(struct Node)); // 创建新的内存空间以便存放链表的元素
    n -> data = data; // 把数据塞到节点里
    if (s -> pNode == NULL)
    {
        n -> pNext = NULL; // 设置栈底的指针为空
    } else {
        n -> pNext = s -> pNode; // 设置上一个节点的指针
    }
    s -> pNode = n; // 设置栈顶的节点指针
    (s -> size) ++; // 元素数量+1
    return data;
}

// 删除栈顶的元素
void pop(struct Stack *s)
{
    struct Node *current = s -> pNode; // 获得当前节点
    if (current -> pNext != NULL) s -> pNode = current -> pNext; // 如果没到栈底,那就把d栈顶元素指向下一个节点
    else s -> pNode = NULL; // 到链表底部了,那就把栈的指针指向空
    free(current); // 释放移除元素的内存空间
    (s -> size) --; // 元素数量-1
}

// 看栈是否为空
int empty(struct Stack s)
{
    return s.size == 0;
}

// 测试
int main()
{
    struct Stack mStack = {NULL, 0}; // 初始化一个栈
    printf("pushed + %d! size = %d\n", push(10, &mStack), mStack.size); // 给栈压入新的元素10
    printf("pushed + %d! size = %d\n\n", push(3,&mStack), mStack.size); // 给栈压入新的元素3
    printf("top = %d\n", top(mStack)); // 输出此时栈顶的元素
    pop(&mStack); // 移除栈顶的元素
    printf("poped! size = %d\n", mStack.size); // 输出元素个数
    printf("top = %d\n", top(mStack)); // 输出此时栈顶的元素
    pop(&mStack); // 移除栈顶的元素
    printf("poped! size = %d\n", mStack.size); // 输出元素个数
    printf("isEmpty = %d\n", empty(mStack));
    return 0;
}

相关文章

  • C 链表实现栈

    前言 第一次学数据结构,代码写的可能不是很好,大神勿喷,指出来就行。 读本文之前建议先学下链表 C 实现链表 (如...

  • 数据结构java描述

    接口 栈 队列 集合 并查集 映射 数组 链表 栈 数组实现 链表实现 队列 数组实现 链表实现 二分搜索树 集合...

  • 链表实现栈(LIFO)、队列(FIFO)

    今天来用链表实现栈 栈可以用链表实现,压栈操作即在链表头赋值,弹栈只需要将链表头元素指向下一个即可 由此可见,链表...

  • 单链表实现栈(C语言)

    单链表实现栈

  • 链表

    单链表 C实现 Java实现 双链表 C实现 Java实现

  • 数据结构-系列文章

    线性表 单链表 单链表-OC实现 双链表 循环链表 栈 栈 队列 待完善 数组 待完善 树 待完善 图 待完善 哈...

  • 基础算法学习与实践

    数组&链表 1. 快慢指针的方式实现判断链表是否有环 栈和队列 1. 栈实现队列(负负得正) ...

  • C栈(链表实现),及栈相关操作

    一、定义节点以及栈 节点的结构体中由于需要定义struct Node *pnext指针,所以typedef str...

  • 2018-07-09顺序表实现栈

    栈的实现 ——直接用顺序表(列表list)进行 栈结构实现 栈可以用顺序表实现,也可以用链表实现。 栈的操作 St...

  • 链表反转

    链表反转的思路:1.利用栈后进先出的特性,将链表的每个节点都Push进栈,然后再Pop出栈,保存进链表,实现反转。...

网友评论

      本文标题:C 链表实现栈

      本文链接:https://www.haomeiwen.com/subject/wcjerctx.html