链栈的基本操作(超详细)
目录
前言
一.链栈的定义
二、链栈的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; } }
}
五.测试结果
图一
图二
图三
图四
图五
图六
图七
六、总结
栈是一种操作受限的线性表,虽然操作受限,但是与线性表有点类似,只不过栈的插入和删除都在表尾而已。我实现的链栈其实与不带头节点的链表有很大关系,各位也可以参考下链表来学习链栈。
链栈的基本操作(超详细)相关推荐
- python 链栈及基本操作
链栈,即用链表实现栈存储结构 链栈的实现思路同顺序栈类似,顺序栈是将顺序表(数组)的一端作为栈低,另一端为栈顶:链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈低,如图1所示: 将链表头部作为栈顶 ...
- 链栈的基本操作-C语言
链栈的基本操作 用链表实现一个栈 具体实现 定义一个链栈 //定义一个链栈 typedef struct LNode {int data;struct LNode* next; }LNode, *Li ...
- js进栈出栈_链栈及基本操作(包含入栈和出栈)详解
链栈,即用链表实现栈存储结构. 链栈的实现思路同顺序栈类似,顺序栈是将数顺序表(数组)的一端作为栈底,另一端为栈顶:链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈底,如图 1 所示: 图 1 链 ...
- 数据结构 栈-链栈及基本操作
目录 一.栈的定义 二.栈的特点 三.栈的理解 四.链栈引入 五.链栈定义 六.链栈的结构体设计 七.链栈的基本操作 7.1链栈的初始化 7.2链栈判空 7.3链栈入栈 7.4链栈出栈 7.4取栈顶元 ...
- C++实现链栈的基本操作
之前对顺序栈写了基本操作,认为有必要也动手练练栈的链表实现. 对于链栈,一般不会出现栈满的情况. 链栈头文件定义例如以下: #ifndef CSTOCK_H_ #define CSTOCK_H_typ ...
- 栈和队列(超详细Java实现)
栈和队列 一.栈(Stack) 1.概念 2.栈的使用 3.模拟实现一个栈 1. 构造方法 2. 入栈(push) 3. 出栈(pop) 4.获取栈顶元素(peek) 5.获取元素个数(getSize ...
- 栈和队列相互实现 (用队列实现栈/用栈实现队列) 超详细~
1.栈和队列的简单介绍 1.1 栈的简单介绍 栈,一种数据结构,只能从一端进出,先进后出,操作方式主要有出栈和入栈.在Java中,一般使用Stack(已不推荐)和Deque(双端队列)实现. Java ...
- c语言堆栈基本代码入栈出栈_链栈基本操作(入栈和出栈)C语言详解
链,即用 链栈的实现思路同 图 1 链栈示意图 将链表头部作为栈顶的一端,可以避免在实现数据 "入栈" 和 "出栈" 操作时做大量遍历链表的耗时操作. 链表的头 ...
- 【Python数据结构系列】❤️《栈(顺序栈与链栈)》——❤️知识点讲解+代码实现
灵魂拷问:为什么要学数据结构? 数据结构,直白地理解,就是研究数据的存储方式.数据存储只有一个目的,即为了方便后期对数据的再利用.因此,数据在计算机存储空间的存放,决不是胡乱的,这就要求我们选择一种好 ...
最新文章
- 【Qt】Log4Qt(一)下载、编译
- 【STM32】定时器中断实验代码详解
- linux-epoll研究
- CRFsuite:CRF 工具包及sklearn-crfsuite
- eslint 设置全局 变量
- Datawhale-零基础入门NLP-新闻文本分类Task04
- LeetCode 1861. 旋转盒子(前缀和)
- astar插件下载 就行_暗黑破坏神2地图插件常用的设置,做自己的私人订制游戏!...
- C语言当中int,float,double,char这四个有什么区别?
- WEB应用中的信息泄漏以及攻击方法
- 一个key 在10w k/v 找到对应的. (B-tree), 这10w放进B-tree 会有多少层.
- Go-Kit实现莫斯电码转换
- php生成白色背景图片
- 02139 计算机信息检索[成都理工大学自考复习]
- 数据分析专题报告范文6篇_【2018最新】数据分析报告范文-优秀word范文 (5页)
- Google文档初学者指南
- idea中更换java版本
- 亿图脑图MindMaster思维导图及亿图图示会员-骨折啦
- Qt 3D Overview
- 什么是Smalltalk