使用C语言实现链栈(带头结点和不带头结点)
目录
1.链栈
2.链栈的相关操作
(1)数据结构定义
(2)初始化和销毁
(3)入栈
(4)出栈
(5)主函数
(6)测试
1.链栈
链栈和单链表是差不多的,只是规定了入栈和出栈只能在表头一端进行(栈顶)。
注:链栈相比于顺序栈(动态)来说会比较方便的是不用担心插入节点是否出现空间满的问题,但是链栈中的节点之间不是连续的存储关系,逻辑上是连续的,但是在内存中的存储是分布散开的。
注:以上是带头结点的链栈。其实在实际中我们更多的时候是会关注的是栈的实际应用,而不是仅仅关注的是栈本身的简单实现,所以学会了栈的基本操作之后,学会将栈应用到实际中非常的重要,也是对自己的挑战。
使用C语言实现顺序栈
使用栈将十进制转换为八进制
使用栈判断括号是否匹配
使用栈判断回文字符串
使用C语言实现单链表(带头结点)
2.链栈的相关操作
(1)数据结构定义
#include<stdlib.h>
#include<stdio.h>#define MAXSIZE 10typedef int ElemType;typedef struct Linknode {ElemType data;struct Linknode*next;
}*LiStack;//菜单栏
void MenuSqStack(){printf("----------1.入栈元素--------\n");printf("----------2.获取栈顶元素----\n");printf("----------3.弹出栈顶元素----\n");printf("----------4.重新初始化------\n");printf("----------5.退出操作--------\n");
}
(2)初始化和销毁
首先是带头结点:
//初始化
void InitLiStack(LiStack&s){s=(Linknode*)malloc(sizeof(Linknode));if(s==NULL){printf("内存分配失败!\n");return ;}s->next=NULL;printf("空间申请成功!\n");
}
//销毁
void DestryLiStack(LiStack&s){Linknode*p=s->next;while(p!=NULL){Linknode*r=p;p->next=r->next;free(r);}free(s);printf("销毁成功!\n");
}
不带头结点:
//初始化
void InitLiStack(LiStack&s){s=NULL;printf("申请空间成功!\n");
}
//销毁
void DestryLiStack(LiStack&s){Linknode*p=s;while(p->next!=NULL){Linknode*r=p;p=r->next;free(r);}//最后一个节点特殊处理free(p); printf("销毁成功!\n");
}
(3)入栈
带头结点:
//入栈
void PushLiStack(LiStack&s,ElemType e){Linknode*r=(Linknode*)malloc(sizeof(Linknode));r->data=e;r->next=s->next;s->next=r;printf("插入节点成功!\n");
}
不带头结点:
相比于带头点的链栈来说相对较复杂,因为开始的时候s==NULL,所以首选需要将插入的第一个节点做特殊的处理。
//入栈
void PushLiStack(LiStack&s,ElemType e){//如果开始没有节点,特殊处理 if(s==NULL){Linknode*r=(Linknode*)malloc(sizeof(Linknode));r->data=e;r->next=NULL;s=r;printf("插入节点成功!\n"); return ; } Linknode*r=(Linknode*)malloc(sizeof(Linknode));//首先将头结点的值修改为要插入的值e,将r->data=s->data,最后直接在头结点后面插入节点 r即可 r->data=s->data;s->data=e;r->next=s->next;s->next=r;printf("插入节点成功!\n");
}
(4)出栈
带头结点:
//出栈
void PopLiStack(LiStack&s,ElemType&e){if(s->next==NULL){printf("栈空!\n");return;}Linknode*p=s->next;e=p->data;s->next=p->next;free(p);printf("出栈成功!\n");
} //获取栈顶节点
Linknode*GetElem(LiStack&s,ElemType&e){if(s->next==NULL){printf("栈空!\n");return NULL;}Linknode*p=s->next;e=p->data;
}
不带头结点:
删除的操作其实不一定像我这样写,我只是做了一个最后一个节点的特殊处理。
//出栈
void PopLiStack(LiStack&s,ElemType&e){if(s==NULL){printf("栈空!\n");return;}//只有一个节点的时候特殊处理 if(s->next==NULL){e=s->data; free(s);return ;} Linknode*p=s;e=p->data;s->next=p->next;free(p);printf("出栈成功!\n");
} //获取栈顶节点
Linknode*GetElem(LiStack&s,ElemType&e){if(s==NULL){printf("栈空!\n");return NULL;}Linknode*p=s;e=p->data;
}
(5)主函数
主函数对于带头结点和不带头结点都是一样的。
int main() {LiStack s;ElemType e;InitLiStack(s);while(1){int flag=0;bool popFlag=false;Linknode*p;MenuSqStack();printf("请输入操作: ");scanf("%d",&flag);switch(flag){case 1:printf("请输入元素(-1_end): ");scanf("%d",&e);while(e!=-1){PushLiStack(s,e);printf("请输入元素(-1_end): ");scanf("%d",&e);}break;case 2:p=GetElem(s,e);if(p!=NULL){printf("栈顶元素 = %d\n",e);}break;case 3:PopLiStack(s,e);printf("弹出栈顶元素 = %d\n",e);break;case 4://首先要销毁之后再重新申请 DestryLiStack(s);InitLiStack(s);break;default:DestryLiStack(s);printf("结束操作\n");}if(flag==5){break;}}return 0;
}
(6)测试
首先是带头结点的测试;
![](/assets/blank.gif)
不带头结点的测试:
使用C语言实现链栈(带头结点和不带头结点)相关推荐
- 刁肥宅手笔:纯C语言利用链栈实现从后缀表达式Array中顺序输入表达式并求值
链栈+后缀表达式求值算法,借用我自己上次C语言写的链栈,详细实现代码如下: 头文件C_Stack.h: /*C_Stack.h*/#ifndef C_STACK_H_INCLUDED #define ...
- 数据结构(C语言版)——链栈(代码版)
一.代码 #include <stdio.h> #include <stdlib.h>#define OK 1 #define ERROR 0typedef int Statu ...
- (c语言)用链栈表的方式实现输入abcde,输出edcba操作——期末数据结构程序设计
用链栈表的方式实现输入abcde,输出edcba操作,期末数据结构程序设计 文章目录 用链栈表的方式实现输入abcde,输出edcba操作,期末数据结构程序设计 1.链栈的定义 2.链栈的初始化 3. ...
- c语言isempty函数代码,使用C语言实现链栈以及initialize,push,pop,isEmpty,getlength,destory等操作...
本文使用了链栈,相对于顺序栈,链栈具有通常情况下不会出现栈满的情况 链栈和链表很相似. 由于栈的先进后出特性,栈在很多地方都很适用,比如 括号匹配,算术表达式求职,路径判断(走迷宫游戏)高级点的有函数 ...
- 链栈的c语言实现方式,C语言链栈实现
C语言实现链栈总结 最近用C语言实现链栈时遇到了问题,经过上网收索资料以及师兄的讲解顺利地解决了该问题,现就将所遇到的问题以及解决方法总结如下: 1.带有空余头结点的链栈代码实现如下: /****** ...
- 数据结构与算法学习笔记——链栈
数据结构与算法学习笔记(C语言) 链栈 在开始链栈的学习之前,我们先实现一下上一篇文章中提到的检查括号匹配的小程序,鉴于水平有限,本人就随便写一下代码好了,目标仅限于对功能的实现. /*用顺序栈这种数 ...
- 数据结构-链栈详解(很朴实的那种)
链栈的设计与运行 1.链栈 提起链栈,很容易就想到单链表,不过链栈确实可以看做是受限的单链表,因为只能在链表头部进行操作,所以在链栈中也不再附加头结点,栈顶指针就是链表的头指针. 老话一句,实践一遍, ...
- 【数据结构】-链栈(带头结点)
链栈-带头结点 1.头文件及类型定义 2.链栈类型定义 3.函数声明 4.基本操作 4.1 初始化链栈 4.2 判空 4.3 入栈 4.4 出栈 4.5 读取栈顶元素 4.6 main函数 5.小结 ...
- 数据结构--链栈的c语言实现(超详细注释/实验报告)
数据结构–链栈的c语言实现(超详细注释/实验报告) 知识小回顾 栈(Stack)作为一种限定性线性表,是将线性表的插入和删除操作限制为仅在表的一端进行,通常将表中允许进行插入.删除操作的一端成为栈顶( ...
最新文章
- 在SAP PI中建立场景
- Spring 自动装配模式之构造函数装配方式
- linux添加虚拟硬盘命令,虚拟机linux扩盘命令操作
- Linux Socket API Connect 函数详解
- 堆结构导致数据文件不能收缩
- Matlab多组条形图Bar多组误差棒绘制Errorbar位置设置
- 零基础入门语义分割-Task6 分割模型模型集成
- 三维点云学习(4)7-ransac 地面分割+ DBSCAN聚类比较
- order( )函数--R语言
- Sql Server快速入门
- 第二次作业-Steam软件分析
- t分布em参数估计matlab,参数估计的MATLAB实现.ppt
- 上海自考02290 c++语言程序设计试卷,上海交通大学工业自动化专业自考本科招生简章...
- 盘点华为系工控企业——中国A股上市公司最多的创业体系
- mysql的字符串等于函数吗_MySQL函数的字符串函数
- android 服务器201,【报Bug】h5+app 网络请求 状态码返回201会报错200不会
- 禅意Python - The Zen of Python
- 谈移动互联网开发的数据分析和决策思路
- 配电房远程监控运维系统
- 01背包问题 图解+详细解析 (转载)