目录

前言

一.链栈的定义

二、链栈的c++语言结构描述表示

三、链栈中基本操作的实现

3.1链栈的初始化

3.2判断链栈是否为空

3.3求链栈的长度

3.4 链栈的入栈

3.4 链栈的出栈

3.5求栈顶元素

3.6销毁栈

四.链栈的具体实现

五.测试结果

六、总结


前言

本文参考王卓老师的数据结构视频和严蔚敏老师的《数据结构》

一.链栈的定义

栈:操作受限的线性表,限定仅在表尾进行插入和删除操作的线性表,即后进先出。这一端被称为栈顶,相对地,把另一端称为栈底。

链栈:用链式结构存储的栈(我实际用的是不带头结点的单链表)

例子:类似子弹压入弹夹,后放入的子弹可以先从弹夹弹出来。

二、链栈的c++语言结构描述表示

代码如下(示例):

注意:我使用的是不带头节点的单链表

typedef struct LinkNode{
    int data;//数据域
    struct LinkNode *next;//指针域 
}stackNode,*LinkStack;

三、链栈中基本操作的实现

3.1链栈的初始化

无需new,因为我是不带头结点的单链表

void initStack(LinkStack &s)
{s=NULL;//不需要头节点
}

3.2判断链栈是否为空

当s==NULL时,栈为空,则返回1;否则,返回0

int stackEmpty(LinkStack s)
{if(s==NULL)return 1;return 0;
}

3.3求链栈的长度

长度表示有多少个节点

int stackLength(LinkStack s)
{int sum=0;stackNode *temp=s;while(temp!=NULL){sum++;temp=temp->next;}return sum;
}

3.4 链栈的入栈

p是新节点

关键处在于当栈为空的时候,p就是第一个节点;而当栈不为空时,则让p的next指针指向s,而s更新到p节点,相当于还是让p作为第一个节点

void push(LinkStack &s,int e)
{stackNode *p=new stackNode;p->data=e;p->next=NULL;if(s==NULL)s=p;else{p->next=s;s=p;}
}

3.4 链栈的出栈

当栈为空的时候,是无法弹出的

new一个p节点

而当栈不空时,则让p指向s的第一个节点,更新s,使s指向下一个节点,在删掉p

void pop(LinkStack &s,int &e)
{stackNode *p=new stackNode;if(s==NULL){cout<<"栈为空,无法弹出"<<endl;}else{p=s;e=p->data;s=s->next;delete p;cout<<"成功弹出栈顶元素"<<endl;}
}

3.5求栈顶元素

当栈不空时,返回第一个节点的数据

int top(LinkStack s)
{if(s==NULL)return -1;return s->data;
}

3.6销毁栈

void DestoryStack(LinkStack &S)
{stackNode *p;while(S){p=S;S=S->next;delete p;}S=NULL;cout<<"成功销毁"<<endl;
}

四.链栈的具体实现

#include <iostream>
using namespace std;
//不带头节点的
typedef struct LinkNode{int data;//数据域struct LinkNode *next;//指针域
}stackNode,*LinkStack;
void initStack(LinkStack &s)
{s=NULL;//不需要头节点
}
int stackEmpty(LinkStack s)
{if(s==NULL)return 1;return 0;
}
int stackLength(LinkStack s)
{int sum=0;stackNode *temp=s;while(temp!=NULL){sum++;temp=temp->next;}return sum;
}
void push(LinkStack &s,int e)
{stackNode *p=new stackNode;p->data=e;p->next=NULL;if(s==NULL)s=p;else{p->next=s;s=p;}
}
void pop(LinkStack &s,int &e)
{stackNode *p=new stackNode;if(s==NULL){cout<<"栈为空,无法弹出"<<endl;}else{p=s;e=p->data;s=s->next;delete p;cout<<"成功弹出栈顶元素"<<endl;}
}
int top(LinkStack s)
{if(s==NULL)return -1;return s->data;
}//销毁栈
//所有节点
void DestoryStack(LinkStack &S)
{stackNode *p;while(S){p=S;S=S->next;delete p;}S=NULL;cout<<"成功销毁"<<endl;
}void menu()
{cout<<"**************************"<<endl;cout<<"1.初始化"<<endl;cout<<"2.判断栈是否为空"<<endl;cout<<"3.求栈的长度"<<endl;cout<<"4.销毁栈"<<endl;cout<<"5.入栈"<<endl;cout<<"6.出栈"<<endl;cout<<"7.求栈顶元素"<<endl;cout<<"8.退出"<<endl;cout<<"**************************"<<endl;
}
int main()
{int choice;LinkStack s;int e1,e2;while(1){menu();cin>>choice;switch(choice){case 1:initStack(s);cout<<"初始化成功"<<endl;break;case 2:if(stackEmpty(s))cout<<"栈为空"<<endl;elsecout<<"栈不为空"<<endl; break;case 3:cout<<"栈的长度为"<<stackLength(s)<<endl;break;case 4:DestoryStack(s);break;case 5:cout<<"请输入想要入栈的元素值:"<<endl;cin>>e1;push(s,e1);cout<<"入栈成功"<<endl; break;   case 6:pop(s,e2);cout<<"弹出的元素为"<<e2<<endl;break;case 7:if(top(s)!=-1)cout<<"栈顶元素为"<<top(s)<<endl;elsecout<<"栈为空"<<endl;break;case 8:cout<<"成功退出"<<endl;exit(0);default:cout<<"输入有误,请重新输入"<<endl;break;            }   }
}

五.测试结果

图一

图二

图三

图四

图五

图六

图七

六、总结

栈是一种操作受限的线性表,虽然操作受限,但是与线性表有点类似,只不过栈的插入和删除都在表尾而已。我实现的链栈其实与不带头节点的链表有很大关系,各位也可以参考下链表来学习链栈。

链栈的基本操作(超详细)相关推荐

  1. python 链栈及基本操作

    链栈,即用链表实现栈存储结构 链栈的实现思路同顺序栈类似,顺序栈是将顺序表(数组)的一端作为栈低,另一端为栈顶:链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈低,如图1所示: 将链表头部作为栈顶 ...

  2. 链栈的基本操作-C语言

    链栈的基本操作 用链表实现一个栈 具体实现 定义一个链栈 //定义一个链栈 typedef struct LNode {int data;struct LNode* next; }LNode, *Li ...

  3. js进栈出栈_链栈及基本操作(包含入栈和出栈)详解

    链栈,即用链表实现栈存储结构. 链栈的实现思路同顺序栈类似,顺序栈是将数顺序表(数组)的一端作为栈底,另一端为栈顶:链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈底,如图 1 所示: 图 1 链 ...

  4. 数据结构 栈-链栈及基本操作

    目录 一.栈的定义 二.栈的特点 三.栈的理解 四.链栈引入 五.链栈定义 六.链栈的结构体设计 七.链栈的基本操作 7.1链栈的初始化 7.2链栈判空 7.3链栈入栈 7.4链栈出栈 7.4取栈顶元 ...

  5. C++实现链栈的基本操作

    之前对顺序栈写了基本操作,认为有必要也动手练练栈的链表实现. 对于链栈,一般不会出现栈满的情况. 链栈头文件定义例如以下: #ifndef CSTOCK_H_ #define CSTOCK_H_typ ...

  6. 栈和队列(超详细Java实现)

    栈和队列 一.栈(Stack) 1.概念 2.栈的使用 3.模拟实现一个栈 1. 构造方法 2. 入栈(push) 3. 出栈(pop) 4.获取栈顶元素(peek) 5.获取元素个数(getSize ...

  7. 栈和队列相互实现 (用队列实现栈/用栈实现队列) 超详细~

    1.栈和队列的简单介绍 1.1 栈的简单介绍 栈,一种数据结构,只能从一端进出,先进后出,操作方式主要有出栈和入栈.在Java中,一般使用Stack(已不推荐)和Deque(双端队列)实现. Java ...

  8. c语言堆栈基本代码入栈出栈_链栈基本操作(入栈和出栈)C语言详解

    链,即用 链栈的实现思路同 图 1 链栈示意图 将链表头部作为栈顶的一端,可以避免在实现数据 "入栈" 和 "出栈" 操作时做大量遍历链表的耗时操作. 链表的头 ...

  9. 【Python数据结构系列】❤️《栈(顺序栈与链栈)》——❤️知识点讲解+代码实现

    灵魂拷问:为什么要学数据结构? 数据结构,直白地理解,就是研究数据的存储方式.数据存储只有一个目的,即为了方便后期对数据的再利用.因此,数据在计算机存储空间的存放,决不是胡乱的,这就要求我们选择一种好 ...

最新文章

  1. 【Qt】Log4Qt(一)下载、编译
  2. 【STM32】定时器中断实验代码详解
  3. linux-epoll研究
  4. CRFsuite:CRF 工具包及sklearn-crfsuite
  5. eslint 设置全局 变量
  6. Datawhale-零基础入门NLP-新闻文本分类Task04
  7. LeetCode 1861. 旋转盒子(前缀和)
  8. astar插件下载 就行_暗黑破坏神2地图插件常用的设置,做自己的私人订制游戏!...
  9. C语言当中int,float,double,char这四个有什么区别?
  10. WEB应用中的信息泄漏以及攻击方法
  11. 一个key 在10w k/v 找到对应的. (B-tree), 这10w放进B-tree 会有多少层.
  12. Go-Kit实现莫斯电码转换
  13. php生成白色背景图片
  14. 02139 计算机信息检索[成都理工大学自考复习]
  15. 数据分析专题报告范文6篇_【2018最新】数据分析报告范文-优秀word范文 (5页)
  16. Google文档初学者指南
  17. idea中更换java版本
  18. 亿图脑图MindMaster思维导图及亿图图示会员-骨折啦
  19. Qt 3D Overview
  20. 什么是Smalltalk

热门文章

  1. glBufferSubData简介
  2. Java多线程下载器(简洁版)
  3. 关于setup factory的一些基本操作
  4. 解决浏览器下载文件 中文名字乱码解决
  5. ubuntu 系统安装ROS包ros-kinetic-map-server报错有依赖包,但是不安装
  6. 双击SumatraPDF无法进入latex对应位置的解决办法
  7. 图片合成matlab,【Matlab】表情合成尝试(1)——Matlab图像基本
  8. idea下编译mybatis源码
  9. QtDataVisualization Q3DBars绘制柱状图
  10. 【2-Python基本图形绘制】嵩天《Python语言程序设计》