链栈(入栈,出栈,遍历)

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

一、链栈概述

1.为什么要用链栈?

链式存储结构可以更好的避免栈上溢,因为顺序栈在定义结构体时需要定义最大值。

2.什么是链栈

栈的链式存储结构就是链栈,栈底就是链表的最后一个结点,而栈顶是链表的第一个结点,一个链栈可以由栈顶指针top唯一确定。

结构体的定义:

#include<stdio.h>
#include<stdlib.h>
typedef struct Stack{
	int data;
	struct Stack *next;
}*LStack;

二、基本操作

//初始化链栈 
 int Init(LStack &top){
 	top=(Stack *)malloc(sizeof(Stack));
 	if(top==NULL){
 		printf("申请内存失败\n");
 		return -1;
	 }
	 top->next=NULL;
 	return 1;
 }
 //入栈
  int pushLstack(LStack &top,int e){
  	LStack s;
  	s=(Stack *)malloc(sizeof(Stack));  //申请结点 
  	if(s==NULL){
  		printf("申请失败!");
  		return -1;
	  }
	s->data=e;                         //接收数据 
	s->next=top->next;                 //类似尾插链表 
	top->next=s;
	return 1; 
  } 
//出栈
 int popLstack(LStack  &top){
 	LStack p;
 	if(top->next==NULL){
 		printf("栈空!");
 		return 0;
	 } 
	p=top->next;
	top->next=p->next;
	printf("%d出栈\n",p->data);
	free(p); 
	return 1;
 }
 //打印栈
int  printLstack(LStack top){
 	if(top==NULL){
 		printf("栈空!\n");
 		return 0;
	 }
	 LStack p=top->next;
	 while(p){
	 	printf("%d ",p->data);
	 	p=p->next;
	 }
	 }
 int main(){
 	LStack L;
 	Init(L);                   //初始化 
 	int n,a;
 	printf("请输入进栈元素总数:");
 	scanf("%d",&n);
 	for(int i=1;i<=n;i++){
 		printf("请输入第%d个元素:",i);
 		scanf("%d",&a);
 		pushLstack(L,a);        //for循环进栈 
	 }
	 printf("此时栈序列为:");
	printLstack(L);             //打印 
	printf("\n");
	popLstack(L);               //出栈 
	popLstack(L);               //出栈
    printf("\n此时栈序列为:");
 	printLstack(L);             //打印
}

运行结果:

链栈,数据结构与算法(C语言),链表,数据结构

 三、多重链栈

 多重链栈用到结构体数组这一个点。

结构体数组的定义:

1.先声明结构体,再去定义结构体数组

struct 结构体名{
    成员列表;
};
struct 结构体名 数组名[长度] ;

2.声明结构体的同时去定义结构体数组(结构体名可以省略).

struct 结构体名{
    成员列表;
}数组名[长度];

结构体数组的引用:

1.变量类型引用。

 通过:结构数组名[ ].成员变量   来进行操作。

struct Day{
    int  year;
    int  mouth;
    int  day;
}stu[2];
Day[1].year=2022;
Day[1].mouth=2;
Day[1].day=7;

2.指针类型。

通过:结构数组名[ ]->成员变量来操作

typedef struct Stack{
	int data;
	struct Stack *next;
}*LStack;
 struct Stack *top[3];
top[?]->next=?
top[?]->data=?

多重链表操作:

//多重入栈 
void pushs( Stack *top[3],int i,int x){          //i 代表要对哪一个栈进行入栈,x 是输入的值
	Stack *p=(Stack *)malloc(sizeof(Stack));
	p->data=x;
	p->next=top[i]->next;
	top[i]->next=p;
 }
 //多重出栈
void pops( Stack *top[3],int i){
	if(top[i]->next==NULL){
		printf("栈空!");
	}
	Stack *p=top[i]->next;
	top[i]->next=p->next;
	printf("%d出栈 ",p->data);
	free(p);
} 
 //打印栈
int  prints( Stack *top[3],int i){
 	if(top[i]==NULL){
 		printf("栈空!\n");
 		return 0;
	 }
	 LStack p=top[i]->next;
	 while(p){
	 	printf("%d ",p->data);
	 	p=p->next;
	 }
	 }

//main函数执行对于【1】栈的操作,其他的同理

int main(){
 	LStack top[3];                //声明
 	Init(top[3]);                 //初始化
 	pushs(&top[3],1,1);           //1栈进 1-3
 	pushs(&top[3],1,2);
 	pushs(&top[3],1,3);
 	printf("\n此时1栈的序列为:");
 	prints(&top[3],1);              //输出
 	printf("\n");
 	pops(&top[3],1);              //1栈出栈
 	printf("\n此时1栈的序列为:"); 
 	prints(&top[3],1);            //输出
 }

运行结果:(说明问题即可)

链栈,数据结构与算法(C语言),链表,数据结构文章来源地址https://www.toymoban.com/news/detail-734665.html

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

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

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

相关文章

  • 【数据结构】顺序栈的基本操作:出栈、入栈、取栈顶元素、输出所有栈中元素、括号匹配题目

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

    2024年02月07日
    浏览(53)
  • 【数据结构】线性表(六)堆栈:顺序栈及其基本操作(初始化、判空、判满、入栈、出栈、存取栈顶元素、清空栈)

       堆栈Stack 和 队列Queue 是两种非常重要的数据结构,两者都是特殊的线性表: 对于堆栈,所有的插入和删除(以至几乎所有的存取)都是在表的同一端进行 对于队列,所有的插入都是在表的一端进行,所有的删除(以至几乎所有的存取)都是在表的另一端进行。    堆

    2024年02月07日
    浏览(44)
  • 【数据结构练习题】栈——1.括号匹配 2.逆波兰表达式求值 3.出栈入栈次序匹配 4.最小栈

    ♥♥♥♥♥个人主页♥♥♥♥♥ ♥♥♥♥♥数据结构练习题总结专栏♥♥♥♥♥ 在学习数据结构的过程中遇到了各种各样类型的题目,我在解答这些题目的时候收获了不少,所以我想开设一个专栏来分享我平时做题的收获,在我分享的题中我采用三步法来阐述,希望大家可

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

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

    2024年02月05日
    浏览(42)
  • 【数据结构】C语言实现链栈

    大家好,很高兴又和大家见面啦!!! 在上一篇内容中,我们简单介绍了一下如何解决顺序栈空间不够的方法: 在创建顺序栈前,提前在空间内容申请一篇足够大的空间; 创建一个动态的链栈; 当我们使用第一种方式时,如果我们此时需要创建的是两个同类型的顺序栈,那

    2024年01月23日
    浏览(37)
  • 数据结构:链栈(含完整代码,可复制)

           链栈是采用链式存储结构实现的栈,通常用单链表来表示。链栈的优点是不存在栈满上溢的情况(只有在内存溢出时才会出现栈满,通常不考虑)。链栈的栈顶是链表的第一个结点,栈底是链表的最后一个结点,一个链栈可以由栈顶指针唯一确定。链栈的每个结点都

    2024年02月01日
    浏览(51)
  • 【数据结构】链栈的基本操作(C语言)

    零零总总搜索了一些关于链栈的资料,了解了链栈的基本操作,一直觉得别人写的代码或多或少存在一些问题,所以打算自己写一篇关于链栈的文章,也算是对所学知识的梳理和巩固了。 首先说明本文使用C语言进行链栈的基本操作,链栈是无头结点的。这里补充说明一下,

    2024年02月05日
    浏览(57)
  • 数据结构与算法-二叉树的遍历

    🌞 “少年没有乌托邦,心向远方自明朗!” 二叉树的遍历是按照一定次序访问二叉树中的所有结点,且每个结点仅被访问一次的过程。遍历线性结构是容易解决的,而二叉树的结构是非线性结构,需要寻找规律,使二叉树的结点排列在一个线性队列上,便于遍历。 由二叉树

    2024年02月08日
    浏览(45)
  • 【算法】递归解决各种数据结构的遍历问题

    对于递归算法,我们最先想到的应该就是用递归的方式去中序遍历一棵树,递归的使用使得我们可以先深入到下层中,然后慢慢的输出下层的元素之后输出上层元素。 因此,基于此,我们甚至可以使用递归来逆序输出一个栈,链表等数据结构。 使用递归输出树 使用递归逆序

    2024年02月08日
    浏览(65)
  • 【数据结构】 链栈的基本操作 (C语言版)

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

    2024年01月24日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包