C语言 数据结构 之 链式栈
栈的链式存储结构简称为 链式栈
链式栈是通过单链表来实现的。每次入栈一个元素,向链表中添加一个节点(相当于头插法),出栈一个元素,释放一个节点。
链式栈是通过单链表来实现的。每次入栈一个元素,向链表中添加一个节点,出栈一个元素,释放一个节点。因为栈具有“后进先出”的特点,如果每次在链表的尾部进行插入和删除,就要遍历整个链表来找到尾节点。而在头部进行插入和删除时,只需根据头指针即可找到链表的首元素结点。而无需遍历链表。所以链式栈的出,入栈通过对链表进行头删和头插来实现。
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语言 数据结构 之 链式栈相关推荐
- Go语言-数据结构与算法
go语言之专业数据结构与算法 3.golang实现数组结构 code\ArrayList\ArrayList.go package ArrayListimport ("errors" ...
- C语言数据结构-栈的使用及实例
本文主要讨论C语言数据结构的又一重要结构--栈 一.栈的理论知识 1. 定义和特点 定义:只允许在一端插入和删除的线性表:允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom). 特点 ...
- c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出
C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include #incl ...
- 数据结构c语言版第一章答案,《c语言数据结构》第一章概论自测题答案
<<c语言数据结构>第一章概论自测题答案>由会员分享,可在线阅读,更多相关<<c语言数据结构>第一章概论自测题答案(4页珍藏版)>请在人人文库网上搜索. ...
- 一些可运行的C语言数据结构代码
网上有很多C语言数据结构代码:有的不能运行:下面是一些能运行的,和运行截图:备用一下: 1 队列 #include<stdio.h> #include<stdlib.h>#de ...
- C语言数据结构学习用单元测试
药物名称: C语言数据结构学习用单元测试 主治: 本品是基于CUnit编写的.全部的.纯C的数据结构(ADT)各种实现的单元测试.主治基础不牢,水品增长缓慢.建议配合严蔚敏<数据结构>(C ...
- 顺序表输入栈元素c语言,C语言数据结构之栈简单操作
C语言数据结构之栈简单操作 实验: 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化顺序栈 (2)插入元素 (3)删除栈顶元素 (4)取栈顶元素 (5)遍 ...
- 用数据结构c语言写成绩排序,C语言数据结构 快速排序实例详解
C语言数据结构 快速排序实例详解 一.快速排序简介 快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序. 二.代码实现 # ...
- 厦门理工C语言实验报告8,厦门理工c语言数据结构实验
<厦门理工c语言数据结构实验>由会员分享,可在线阅读,更多相关<厦门理工c语言数据结构实验(15页珍藏版)>请在人人文库网上搜索. 1.数据结构实验报告 实验序号:6 实验项目 ...
最新文章
- 这也不能一直在这儿瞎忙活
- 梓益C语言学习笔记之链表&动态内存&文件
- 不含抽象方法的抽象类 java_Java:抽象类继承非抽象类,且不包含抽象方法有何负面作用吗?...
- liunx系统内核安装图形化界面
- Scala 入门2(数组、List、Set、Map、元组、Option、Iterator)
- cups支持的打印机列表_网络存储让你的打印机瞬间变无线,打印文件不用愁
- 手把手教你启动若依微服务项目
- CCF201903-4 消息传递接口(100分)【模拟】
- 如何获取Android移动终端设备唯一ID
- 小米3c虚拟服务器,小米路由器3C固件逆向与测评-新手向
- 软件测试中的缺陷分析与管理
- PASCAL VOC2012数据集介绍与制作自己的数据集
- php还原时间戳,如何将php时间戳转换回日期
- 教你做一个最简版的倒计时计时器,新手也能秒懂。
- Ubuntu /home下中文目录如何修改成英文
- ConneR and the A.R.C. Markland-N--- codeforces1293A
- java:窗体里的标签(设置标签;字体;颜色)
- AVL树(动图详解)
- python绘制多边形的程序_Python – 绘制多边形
- 揭秘:男人什么时候最想结婚
热门文章
- 如何更改 think-cell 图表的默认颜色?使用教程
- 写mall项目报错Tests run: 1, Failures: 0, Errors
- Android抓包指南①: 使用Fiddler抓HTTP/HTTPS包
- 第十二届CDA认证考试报告重磅发布!
- 《今生若能相依 定不再颠沛流离》彭文金作品赏析
- [CAD] 彩色CAD导出为黑白PDF
- matlab 2016b vs2010,在Matlab2010b中调用 Microsoft Visual C++ 2010
- using static简化静态成员的使用
- FreeBSD 安装配置
- 【python实现网络爬虫(14)】python爬取酷狗中多类型音乐步骤详解(附全部源代码)