链栈的基本操作(超详细)

这篇具有很好参考价值的文章主要介绍了链栈的基本操作(超详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一.链栈的定义 

二、链栈的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;
				else
					cout<<"栈不为空"<<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;
				else
					cout<<"栈为空"<<endl;
				break;
			case 8:
				cout<<"成功退出"<<endl;
				exit(0);
			default:
				cout<<"输入有误,请重新输入"<<endl;
				break;			
		}	
	}
}

五.测试结果

链栈的基本操作(超详细)

        图一

链栈的基本操作(超详细) 

        图二 

 链栈的基本操作(超详细)

         图三

链栈的基本操作(超详细)

        图四

链栈的基本操作(超详细) 

        图五

链栈的基本操作(超详细) 

        图六

链栈的基本操作(超详细) 

        图七

六、总结 

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

 文章来源地址https://www.toymoban.com/news/detail-424714.html

到了这里,关于链栈的基本操作(超详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 栈的定义及基本操作实现(顺序栈)

    个人主页:【😊个人主页】 系列专栏:【❤️数据结构与算法】 学习名言:天子重英豪,文章教儿曹。万般皆下品,惟有读书高 第一章 ❤️ 学前知识 第二章 ❤️ 单向链表 第三章 ❤️ 递归 相信大家小时后一定玩过玩具枪吧,在我们装子弹时玩具枪的子弹只能从弹夹的一

    2023年04月08日
    浏览(58)
  • 【头歌】顺序栈的基本操作及应用

    任务描述 本关任务是实现顺序栈的基本操作函数,以实现判断栈是否为满、是否为空、求栈元素个数、进栈和出栈等功能。 相关知识 栈的基本概念 栈 是一种特殊的线性表,其特殊性体现在元素插入和删除运算上,它的插入和删除运算仅限定在表的某一端进行,不能在表中

    2024年02月02日
    浏览(72)
  • 数据结构之栈的基本操作

    该顺序栈涉及到了存储整型数据的顺序栈还有存储字符型数据的顺序栈 实现的功能有:入栈、出栈、判断是否为空栈、求栈的长度、清空栈、销毁栈、得到栈顶元素 此外根据上述功能,编写了数值转换(十进制转化八进制)方法、括号匹配方法。 控制台界面展示: 进栈展示

    2024年01月23日
    浏览(35)
  • 数据结构学习——C语言对栈的基本操作

             栈(Stack)是一种常用的数据结构,遵循先进后出(LIFO)的原则,对表尾进行操作,常用于临时存储和撤销等操作,其基本操作包括栈的创建、入栈(也叫压栈Push)、出栈(又称弹栈)、栈的遍历、栈的清空(clear)、栈的销毁(destroy)等。         栈的创建有两种方式,一种是通

    2024年02月07日
    浏览(39)
  • 【数据结构】 顺序栈的基本操作 (C语言版)

    目录 一、顺序栈 1、顺序栈的定义: 2、顺序栈的优缺点 二、顺序栈的基本操作算法(C语言)    1、宏定义  2、创建结构体 3、顺序栈的初始化  4、顺序栈的入栈 5、顺序栈的出栈 6、取栈顶元素 7、栈的遍历输出 8、顺序栈的判空 9、顺序栈的判满  10、求顺序栈长度 11、顺

    2024年01月24日
    浏览(38)
  • 【数据结构】栈和队列(栈的基本操作和基础知识)

    🌈个人主页: 秦jh__ https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏: 《数据结构》 https://blog.csdn.net/qinjh_/category_12536791.html?spm=1001.2014.3001.5482 目录  前言 栈 栈的概念和结构 栈的实现 ​编辑 数组栈的实现 总的声明 初始化  插入 删除 取栈顶元素 销毁 判断是否为空

    2024年02月03日
    浏览(38)
  • 【 第4关:入栈和出栈的基本操作】【编程题实训-栈】【头歌】【bjfu-243】

    本关任务:输入一个整数序列a1,a2,a3…,an。当ai不等于-1时将ai进栈;当ai=-1时,输出栈顶元素并将其出栈。 输入 多组数据,每组数据有两行,第一行为序列的长度n,第二行为n个整数,整数之间用空格分隔。当n=0时输入结束。 输出 对于每一组数据输出若干行。每行为相应的出

    2024年02月06日
    浏览(30)
  • 【数据结构】顺序栈的基本操作:出栈、入栈、取栈顶元素、输出所有栈中元素、括号匹配题目

    栈是限定仅在表位进行插入或删除操作的线性表。栈的表尾称为栈顶,表头称为栈底。不含元素的栈称为空栈。 左图为栈的示意图,右图为用铁路调度表示栈。 如下是入栈至栈满再进行出栈的过程示意图。值得注意的是,栈满后,top指针指向的不是顶端元素,而是顶端的下

    2024年02月07日
    浏览(37)
  • 数据结构:使用顺序栈的基本操作,实现十进制转为二进制,十六进制的转换

    使用系统环境: 1:win10,使用工具dev 2:使用系统win10 3:参考书籍数据结构(C语言版——严蔚敏 吴伟民) ( 注意:此文章默认,学习者拥有一定的数据机构栈,C语言的知识,书籍第20页,2.1算法的代码进行一个简化。)

    2024年02月05日
    浏览(46)
  • 顺序栈的基本操作(存储结构设计、初始化、判空、判满、入栈、出栈、取栈顶元素、遍历输出栈内元素)

    以上为总的代码,对于栈满时存在一些问题待改进 ———————————————————————————————————————— 以下为代码编写过程,有参考网上大佬的代码   创建栈后报错,在scanf_s处缺少符号  会执行两遍创建栈?   在主函数里边确实有两

    2024年02月05日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包