目录

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)测试

首先是带头结点的测试;

不带头结点的测试:

使用C语言实现链栈(带头结点和不带头结点)相关推荐

  1. 刁肥宅手笔:纯C语言利用链栈实现从后缀表达式Array中顺序输入表达式并求值

    链栈+后缀表达式求值算法,借用我自己上次C语言写的链栈,详细实现代码如下: 头文件C_Stack.h: /*C_Stack.h*/#ifndef C_STACK_H_INCLUDED #define ...

  2. 数据结构(C语言版)——链栈(代码版)

    一.代码 #include <stdio.h> #include <stdlib.h>#define OK 1 #define ERROR 0typedef int Statu ...

  3. (c语言)用链栈表的方式实现输入abcde,输出edcba操作——期末数据结构程序设计

    用链栈表的方式实现输入abcde,输出edcba操作,期末数据结构程序设计 文章目录 用链栈表的方式实现输入abcde,输出edcba操作,期末数据结构程序设计 1.链栈的定义 2.链栈的初始化 3. ...

  4. c语言isempty函数代码,使用C语言实现链栈以及initialize,push,pop,isEmpty,getlength,destory等操作...

    本文使用了链栈,相对于顺序栈,链栈具有通常情况下不会出现栈满的情况 链栈和链表很相似. 由于栈的先进后出特性,栈在很多地方都很适用,比如 括号匹配,算术表达式求职,路径判断(走迷宫游戏)高级点的有函数 ...

  5. 链栈的c语言实现方式,C语言链栈实现

    C语言实现链栈总结 最近用C语言实现链栈时遇到了问题,经过上网收索资料以及师兄的讲解顺利地解决了该问题,现就将所遇到的问题以及解决方法总结如下: 1.带有空余头结点的链栈代码实现如下: /****** ...

  6. 数据结构与算法学习笔记——链栈

    数据结构与算法学习笔记(C语言) 链栈 在开始链栈的学习之前,我们先实现一下上一篇文章中提到的检查括号匹配的小程序,鉴于水平有限,本人就随便写一下代码好了,目标仅限于对功能的实现. /*用顺序栈这种数 ...

  7. 数据结构-链栈详解(很朴实的那种)

    链栈的设计与运行 1.链栈 提起链栈,很容易就想到单链表,不过链栈确实可以看做是受限的单链表,因为只能在链表头部进行操作,所以在链栈中也不再附加头结点,栈顶指针就是链表的头指针. 老话一句,实践一遍, ...

  8. 【数据结构】-链栈(带头结点)

    链栈-带头结点 1.头文件及类型定义 2.链栈类型定义 3.函数声明 4.基本操作 4.1 初始化链栈 4.2 判空 4.3 入栈 4.4 出栈 4.5 读取栈顶元素 4.6 main函数 5.小结 ...

  9. 数据结构--链栈的c语言实现(超详细注释/实验报告)

    数据结构–链栈的c语言实现(超详细注释/实验报告) 知识小回顾 栈(Stack)作为一种限定性线性表,是将线性表的插入和删除操作限制为仅在表的一端进行,通常将表中允许进行插入.删除操作的一端成为栈顶( ...

最新文章

  1. 在SAP PI中建立场景
  2. Spring 自动装配模式之构造函数装配方式
  3. linux添加虚拟硬盘命令,虚拟机linux扩盘命令操作
  4. Linux Socket API Connect 函数详解
  5. 堆结构导致数据文件不能收缩
  6. Matlab多组条形图Bar多组误差棒绘制Errorbar位置设置
  7. 零基础入门语义分割-Task6 分割模型模型集成
  8. 三维点云学习(4)7-ransac 地面分割+ DBSCAN聚类比较
  9. order( )函数--R语言
  10. Sql Server快速入门
  11. 第二次作业-Steam软件分析
  12. t分布em参数估计matlab,参数估计的MATLAB实现.ppt
  13. 上海自考02290 c++语言程序设计试卷,上海交通大学工业自动化专业自考本科招生简章...
  14. 盘点华为系工控企业——中国A股上市公司最多的创业体系
  15. mysql的字符串等于函数吗_MySQL函数的字符串函数
  16. android 服务器201,【报Bug】h5+app 网络请求 状态码返回201会报错200不会
  17. 禅意Python - The Zen of Python
  18. 谈移动互联网开发的数据分析和决策思路
  19. 配电房远程监控运维系统
  20. 01背包问题 图解+详细解析 (转载)

热门文章

  1. 如何快速接手项目(iOS)
  2. 解决H5中背景音乐无法自动播放问题
  3. videojs 加入关闭按钮
  4. 设计一个简单的单布电梯运行控制系统
  5. 毫米波雷达编程 csdn_这周在我们的雷达上:聚合物,图案和编程器
  6. JAVA算法策略模式之商品打折 满x送x
  7. Angluar初学者快速上手教程2021(理论+实例)
  8. 【ppt基础教程】教你用PowerPoint轻松实现板书效果
  9. VINS-Mono之IMU预积分,预积分误差、协方差及误差对状态量雅克比矩阵的递推方程的推导
  10. 10个免费PDF转PPT方法,请收好以备不时之需!