栈的链式存储结构简称为 链式栈

链式栈是通过单链表来实现的。每次入栈一个元素,向链表中添加一个节点(相当于头插法),出栈一个元素,释放一个节点。

链式栈是通过单链表来实现的。每次入栈一个元素,向链表中添加一个节点,出栈一个元素,释放一个节点。因为栈具有“后进先出”的特点,如果每次在链表的尾部进行插入和删除,就要遍历整个链表来找到尾节点。而在头部进行插入和删除时,只需根据头指针即可找到链表的首元素结点。而无需遍历链表。所以链式栈的出,入栈通过对链表进行头删和头插来实现。

1. 链式栈的结点结构

        链式栈是有单链表来实现的,所以与单链表的结点结构相同。由数据域和指向下一个结点的指针域(next域)组成。

//链式结构  =数据域+指针域
struct Node
{int data;struct Node *next;
};

2. 链式栈的初始化

        与单链表的初始化相同,可以设置函数单独先对每个节点进行初始化操作。

//  2、创建节点  为插入做准备,学习数据的时候,一定要把功能划分明确
struct Node *createNode(int data)
{struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));newNode->data = data;newNode->next = NULL;return newNode;  返回指针变量
}

 3、表头插入
//  插在头结点之后  插队插入,不能越过头结点
//  插队插入,不能越过头结点

void insertNodeByHead(struct Node *headNode, int data)  //表头法插入
{// 1、插入的新节点的定义变量struct Node* newNode = createNode(data);// 2、 插在头结点之后  插队插入,不能越过头结点newNode->next = headNode->next;headNode->next = newNode;
}

4、打印,浏览信息

void printList(struct Node *headNode)  //打印,浏览信息
{//  有表头,要从第二个节点开始打印struct Node *pMove = headNode->next;while (pMove != NULL){printf("%d\t", pMove->data);pMove = pMove->next;}printf("\n");
}

5、栈操作

struct  stack
{struct Node* stackTop;    //  用栈顶指针表示整个链表int size;                 //  数据结构中的万金油  记录数据结构中元素的个数};//  1、指针----->指针变量  动态内存申请//  2、初始化变量//  3、返回变量
struct  stack *createStack()
{//1、指针----->指针变量struct  stack *mystack = (struct  stack*)malloc(sizeof(struct  stack));//2、初始化变量mystack->size = 0;mystack->stackTop = NULL;//3、返回变量return mystack;
}//入栈函数
/*  将指定的数据压入栈 */
void push(struct  stack *mystack, int data)
{//入栈操作----->链表的表头插入//无表头的链表struct Node *newNode = createNode(data);newNode->next = mystack->stackTop;  //新来元素的下一个next指向栈顶指针,连续存储mystack->stackTop = newNode;   //用栈顶指针  永远指向新来的元素mystack->size++;
}int getTop(struct  stack *mystack)  //获取栈顶元素
{if (mystack->size == 0){printf("栈为空!,无法获取");system("pause");return mystack->size;}return mystack->stackTop->data;}void pop(struct  stack *mystack)
{if (mystack->size == 0){printf("栈为空!,无法出栈");system("pause");}else{//  无表头的链表进行删除struct Node *nextNode = mystack->stackTop->next;  //先保存记录free(mystack->stackTop);  //将原先节点的占用的内存释放mystack->stackTop = nextNode;mystack->size--;}
}int empty(struct  stack *mystack)
{if (mystack->size == 0){return 0;}elsereturn 1;//返回1,代表栈不为空}

6、总代码

/*栈的应用
// 1、寻路算法  迷宫
// 2、悔棋退步问题
// 3、了解栈  FILO  先进后出  先存后拿
// 4、属于自己的编译方式
// 5、解决问题的能力
*/#include<stdio.h>
#include<stdlib.h>
//链式结构  =数据域+指针域
struct Node
{int data;struct Node *next;
};//  2、创建节点  为插入做准备,学习数据的时候,一定要把功能划分明确
struct Node *createNode(int data)
{struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));newNode->data = data;newNode->next = NULL;return newNode;  返回指针变量
}//  3、表头插入
//  插在头结点之后  插队插入,不能越过头结点
//  插队插入,不能越过头结点// 函数参数设计是具有含义的:插入那个链表??插入的新节点的定义变量
void insertNodeByHead(struct Node *headNode, int data)  //表头法插入
{// 1、插入的新节点的定义变量struct Node* newNode = createNode(data);// 2、 插在头结点之后  插队插入,不能越过头结点newNode->next = headNode->next;headNode->next = newNode;
}//  4、表尾插入
void insertNodeByTail(struct Node *headNode, int data)
{struct Node* newNode = createNode(data);struct Node* tailNode = headNode;while (tailNode->next != NULL){tailNode = tailNode->next;}tailNode->next = newNode;
}void printList(struct Node *headNode)  //打印,浏览信息
{//  有表头,要从第二个节点开始打印struct Node *pMove = headNode->next;while (pMove != NULL){printf("%d\t", pMove->data);pMove = pMove->next;}printf("\n");
}/****************************栈操作********************/
//    用结构体封装一个栈
struct  stack
{struct Node* stackTop;    //  用栈顶指针表示整个链表int size;                 //  数据结构中的万金油  记录数据结构中元素的个数};//  1、指针----->指针变量  动态内存申请//  2、初始化变量//  3、返回变量
struct  stack *createStack()
{//1、指针----->指针变量struct  stack *mystack = (struct  stack*)malloc(sizeof(struct  stack));//2、初始化变量mystack->size = 0;mystack->stackTop = NULL;//3、返回变量return mystack;
}//入栈函数
/*  将指定的数据压入栈 */
void push(struct  stack *mystack, int data)
{//入栈操作----->链表的表头插入//无表头的链表struct Node *newNode = createNode(data);newNode->next = mystack->stackTop;  //新来元素的下一个next指向栈顶指针,连续存储mystack->stackTop = newNode;   //用栈顶指针  永远指向新来的元素mystack->size++;
}int getTop(struct  stack *mystack)  //获取栈顶元素
{if (mystack->size == 0){printf("栈为空!,无法获取");system("pause");return mystack->size;}return mystack->stackTop->data;}void pop(struct  stack *mystack)
{if (mystack->size == 0){printf("栈为空!,无法出栈");system("pause");}else{//  无表头的链表进行删除struct Node *nextNode = mystack->stackTop->next;  //先保存记录free(mystack->stackTop);  //将原先节点的占用的内存释放mystack->stackTop = nextNode;mystack->size--;}
}int empty(struct  stack *mystack)
{if (mystack->size == 0){return 0;}elsereturn 1;//返回1,代表栈不为空}
int main()
{//1、链表的实质:结构体变量  和结构体变量  连接在一起struct stack *mystack = createStack();push(mystack, 1);push(mystack, 2);push(mystack, 3);push(mystack, 4);push(mystack, 5);while (empty(mystack)){printf("%d---->\t", getTop(mystack));pop(mystack);}printf("\n");system("pause");return 0;
}

将1 2 3 4 5 入栈,然后出栈

C语言 数据结构 之 链式栈相关推荐

  1. Go语言-数据结构与算法

    go语言之专业数据结构与算法 3.golang实现数组结构 code\ArrayList\ArrayList.go package ArrayListimport ("errors" ...

  2. C语言数据结构-栈的使用及实例

    本文主要讨论C语言数据结构的又一重要结构--栈 一.栈的理论知识 1. 定义和特点 定义:只允许在一端插入和删除的线性表:允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom). 特点 ...

  3. c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出

    C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include #incl ...

  4. 数据结构c语言版第一章答案,《c语言数据结构》第一章概论自测题答案

    <<c语言数据结构>第一章概论自测题答案>由会员分享,可在线阅读,更多相关<<c语言数据结构>第一章概论自测题答案(4页珍藏版)>请在人人文库网上搜索. ...

  5. 一些可运行的C语言数据结构代码

    网上有很多C语言数据结构代码:有的不能运行:下面是一些能运行的,和运行截图:备用一下: 1 队列 #include<stdio.h> #include<stdlib.h>#de ...

  6. C语言数据结构学习用单元测试

    药物名称: C语言数据结构学习用单元测试 主治: 本品是基于CUnit编写的.全部的.纯C的数据结构(ADT)各种实现的单元测试.主治基础不牢,水品增长缓慢.建议配合严蔚敏<数据结构>(C ...

  7. 顺序表输入栈元素c语言,C语言数据结构之栈简单操作

    C语言数据结构之栈简单操作 实验: 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化顺序栈 (2)插入元素 (3)删除栈顶元素 (4)取栈顶元素 (5)遍 ...

  8. 用数据结构c语言写成绩排序,C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 一.快速排序简介 快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序. 二.代码实现 # ...

  9. 厦门理工C语言实验报告8,厦门理工c语言数据结构实验

    <厦门理工c语言数据结构实验>由会员分享,可在线阅读,更多相关<厦门理工c语言数据结构实验(15页珍藏版)>请在人人文库网上搜索. 1.数据结构实验报告 实验序号:6 实验项目 ...

最新文章

  1. 这也不能一直在这儿瞎忙活
  2. 梓益C语言学习笔记之链表&动态内存&文件
  3. 不含抽象方法的抽象类 java_Java:抽象类继承非抽象类,且不包含抽象方法有何负面作用吗?...
  4. liunx系统内核安装图形化界面
  5. Scala 入门2(数组、List、Set、Map、元组、Option、Iterator)
  6. cups支持的打印机列表_网络存储让你的打印机瞬间变无线,打印文件不用愁
  7. 手把手教你启动若依微服务项目
  8. CCF201903-4 消息传递接口(100分)【模拟】
  9. 如何获取Android移动终端设备唯一ID
  10. 小米3c虚拟服务器,小米路由器3C固件逆向与测评-新手向
  11. 软件测试中的缺陷分析与管理
  12. PASCAL VOC2012数据集介绍与制作自己的数据集
  13. php还原时间戳,如何将php时间戳转换回日期
  14. 教你做一个最简版的倒计时计时器,新手也能秒懂。
  15. Ubuntu /home下中文目录如何修改成英文
  16. ConneR and the A.R.C. Markland-N--- codeforces1293A
  17. java:窗体里的标签(设置标签;字体;颜色)
  18. AVL树(动图详解)
  19. python绘制多边形的程序_Python – 绘制多边形
  20. 揭秘:男人什么时候最想结婚

热门文章

  1. 如何更改 think-cell 图表的默认颜色?使用教程
  2. 写mall项目报错Tests run: 1, Failures: 0, Errors
  3. Android抓包指南①: 使用Fiddler抓HTTP/HTTPS包
  4. 第十二届CDA认证考试报告重磅发布!
  5. 《今生若能相依 定不再颠沛流离》彭文金作品赏析
  6. [CAD] 彩色CAD导出为黑白PDF
  7. matlab 2016b vs2010,在Matlab2010b中调用 Microsoft Visual C++ 2010
  8. using static简化静态成员的使用
  9. FreeBSD 安装配置
  10. 【python实现网络爬虫(14)】python爬取酷狗中多类型音乐步骤详解(附全部源代码)