顺序栈和链栈的各种操作

【数据结构】栈的知识点总结--关于栈的定义和基本操作;C语言实现栈;顺序栈;链栈;共享栈;栈的易错点的总结 关于栈的定义和基本操作;C语言实现栈;顺序栈;链栈;共享栈;栈的易错点的总结 阅读详情
 

一.先说顺序栈

/**********************************************************
顺序栈的各种操作13-5-1.cpp
1.初始化栈
2.判断栈空
3.入栈
4.出栈
5.取栈顶元素
6.主函数测试以上功能
***********************************************************/
#include<stdio.h>
#include<stdlib.h>

#define MAX	1000
typedef struct
{
	int data[MAX];
	int top;
}SeStack;

void InitStack(SeStack *S)
{
	S->top=-1;
}

int EmptyStack(SeStack *S)
{
	return ((S->top==-1)?1:0);
}

int Push(SeStack *S, int x)
{
	if(S->top==MAX-1)
	{
		printf("栈满!\n");
		return 0;
	}
	S->data[++S->top]=x;
	return 1;
}

int Pop(SeStack *S, int *x)
{
	if(EmptyStack(S))
	{
		printf("栈空!\n");
		return 0;
	}
	*x=S->data[S->top--];
	return 1;
}

int GetTop(SeStack *S, int *x)
{
	if(EmptyStack(S))
	{
		printf("栈空!\n");
		return 0;
	}
	*x=S->data[S->top];
	return 1;
}

int main()
{
	SeStack *S=(SeStack *)malloc(sizeof(SeStack));
	int n, x, fx, j;
	InitStack(S);
	printf("输入入栈元素个数:\n");
	scanf("%d",&n);
	for(int i=1; i<=n; i++)
	{
		Push(S, i);
	}

	GetTop(S, &fx);
	printf("栈顶元素:%d\n", fx);
	
	printf("栈中元素:\n");
	for(j=S->top; j>-1; j--)
	{
		printf("%3d",S->data[j]);
	}

	for(int i=1; i<=n; i++)
	{
		Pop(S, &x);
		printf("\n出栈元素为:%d\n", x);
	}
	system("pause");
	return 0;
}

二.再说链栈

/**********************************************************
链栈的各种操作13-5-2.cpp和13-5-3.cpp
1.初始化栈
2.判断栈空
3.入栈
4.出栈
5.取栈顶元素
6.主函数测试以上功能
***********************************************************/
#include<stdio.h>
#include<stdlib.h>

typedef struct Lnode
{
	int data;
	struct Lnode *next;
}LinkList;
typedef LinkList LinkStack;

void  InitStack(LinkStack *top)
{
	/*
	top=(LinkStack *)malloc(sizeof(LinkStack));//(1)
	if(top==NULL)
	{
		printf("分配空间失败!\n");
		return 0;
	}
*/
	//printf("(InitStack)top addr:%x\n", top);
	top->next=NULL;
	//return 1;
}

int EmptyStack(LinkStack *top)
{
	return ((top->next==NULL)?1:0);
}

int Push(LinkStack *top, int x)
{
	LinkStack *s=(LinkStack *)malloc(sizeof(LinkStack));
	if(s==NULL)
	{
		printf("分配空间失败!\n");
		return 0;
	}
	s->data=x;
	s->next=top->next;
	top->next=s;
	//printf("(Push)top addr:%x\n", top);
	return 1;
}

int Pop(LinkStack *top, int *x)
{
	LinkStack *p;
	if(EmptyStack(top))
	{
		printf("栈空!\n");
		return 0;
	}
	*x=top->next->data;
	p=top->next;
	top->next=p->next;
	//printf("(Pop)top addr:%x\n", top);
	free(p);
	return 1;
}

int GetTop(LinkStack *top, int *x)
{
	if(EmptyStack(top))
	{
		printf("栈空!\n");
		return 0;
	}
	*x=top->next->data;
	return 1;
}

int main()
{
	LinkStack *top=(LinkStack *)malloc(sizeof(LinkStack));
	//printf("(main)top addr:%x\n", top);
	LinkStack *p;
	int n, x, fx;

	InitStack(top);

	printf("输入入栈元素个数n:\n");
	scanf("%d", &n);
	for(int i=1; i<=n; i++)
	{
		Push(top, i);
	}

	GetTop(top, &fx);
	printf("栈顶元素:%d\n", fx);
	printf("栈中元素:\n");
	for(p=top->next; p!=NULL; p=p->next)//(2)
	{
		printf("%3d", p->data);
	}	
for(int i=1; i<=n; i++)
	{
		Pop(top, &x);
		printf("\n出栈元素为:%d\n", x);
	}
	system("pause");
	return 0;
}
/*************************************************************************************
注意:(1)注意这段注释掉的代码,我习惯性的按照链队列里面初始化队列的方式来初始化
链栈,结果导致运行(2)处,发生地质访问错误。仔细分析一下:(2)处的p移动到最后一个
节点的时候,再往后移动一个就出问题了。按理说最后一个节点的next应该是NULL,看
InitStack函数,确实应该在一开始就给top->next=NULL,但是我在InitStack函数里面却
又申请了一个内存空间,实际上就是给top又赋了一个新的地址,相当于传个参数(指针top)
进去又在函数里面改变了它的地址(给to赋了一个新地址),但是根据函数改变参数的机制,
只有使用二重指针做参数或者传递引用的时候,才能实际的改变参数。如果仅传一个一维指
针,只能改变指针里存的值,不能改变指针本身。这个和p65页面试题很像。可以看验证
截图。main中开辟的空间的首地址是x714e38赋给top,IintStack函数中又给top一个新地
址x714e80,但是IintStack结束之后,到了Push, Pop函数,地址皆为x714e38,和main
中的一样。也就验证了地址在InitStack结束之后根本木有改变。既然这样,在InitStack中给
top->next赋值为NULL,InitStack结束之后,top还是x714e38,这个top的next根本不知
道是什么,所以Push到最后一个的时候,最后一个元素的next就不知道是什么了,因为是由
top->next觉定的,所以也就发生了内存错误。所以再说一点就是建立栈操作时候,想在main函数中给top赋个NULL,然后在Init中开辟空间的,是不行了,要么在主函数中开辟空间给指针赋值,然后到init中直接传过去,注意,通过传参,在别的函数体力就改变不了指针值了。如果习惯在主函数中不管,赋值的活交给Init函数的话,就是用二重指针方式了。
***************************************************************************************/


先看验证注释(1)的运行结果截图

如果按照之前说的,将Init函数改成传二重指针的方式,在main里面仅仅给top=NULL,z Init里面再给top换个值,也就是开辟一段内存。这样就可以了,后面的(2)就可以正常运行了。

具体改动:

1.InitStack中

int  InitStack(LinkStack **top)
{
	
	*top=(LinkStack *)malloc(sizeof(LinkStack));//(1)
	if(*top==NULL)
	{
		printf("分配空间失败!\n");
		return 0;
	}
	printf("(InitStack)top addr:%x\n", *top);
	(*top)->next=NULL;
	return 1;
}

2.main中

int main()
{
	//LinkStack *top=(LinkStack *)malloc(sizeof(LinkStack));
	LinkStack *top=NULL;
…
InitStack(&top);
…
}//去掉上面的,不用给top赋实际地址了,在调用InitStack(&top)的
//时候传递top的地址过去就行了,改到InitStack里面来改变top的值。

看一下运行结果截图:

最后看正常情况下程序的运行结果的图



 

告别Arduino IDE!用VSCode搭建Arduino UNO R3开发环境(含代码补全配置) 本文详细指导如何用VSCode替代Arduino IDE搭建Arduino UNO R3开发环境,包含代码补全配置和高效开发技巧。通过安装必要插件、配置项目结构和优化工作流,可显著提升开发效率,特别适合复杂项目开发。文章还提供了常见问题解决方案和高级功能调优方法。 阅读详情

相关推荐

Java 开发 修改【冒险岛 079 私服】完整学习流程

第 1-2 天:环境搭建 + 运行原版 079 服务端,能正常登录游戏;第 3-4 天:纯配置文件修改,掌握倍率、属性、怪物、道具的修改,改出第一个「百倍经验私服」;第 5-10 天:Java 代码基础修改,掌握 Player/Skill/Monster 核心类的修改,实现技能无冷却、一刀秒怪、升级满属性;第 11-20 天:Java 代码进阶修改,掌握业务逻辑修改,实现死亡不掉经验、自动捡物、装备强化无失败;第 21-30 天。

萧曳丶 3888

数据结构学习之栈

栈 顺序存储(单向 双向) 链表存储(单向 )

m0_54765221的博客 1055

AD2428与SigmaStudio:从节点自动配置与EEPROM存储实战

本文详细介绍了AD2428 A2B收发器与SigmaStudio开发环境的集成应用,重点讲解从节点自动配置与EEPROM存储的实战流程。通过硬件连接、属性配置、数据导出及嵌入式系统集成等步骤,实现设备上电自启动,提升汽车音频系统的可靠性与部署效率。

g8f9d0s1a2的博客 650

顺序栈的完整实现

之前写了一下顺序栈的实现,当时没写完,赶着五一放假,把之前的补写完整,这次把顺序栈的所有操作都写进去了,欢迎交流!!

TingMind的博客 2522

非root用户如何在CentOS7集群上编译安装OpenFOAM6

本文详细介绍了在CentOS7集群上以非root用户身份编译安装OpenFOAM6的完整流程。通过环境准备、依赖包离线获取、源码编译安装等步骤,解决了集群环境下权限和依赖问题,特别针对OpenMPI和Boost库提供了优化配置建议,帮助用户高效完成安装并优化性能。

weixin_28826961的博客 681

IFIX数据库Datebase当前值问号

IFIX数据库Datebase当前值问号,已解决,亲测有效 在OPC PowerTool有数据的情况下,IFIX数据库Datebase当前值显示???? 问题分析及解决方法 我的IFIX5.8版本,其它版本可参考 打开IFIX工作台:应用程序–任务控制–I/O驱动–OPC Client;查看OPC驱动是否被禁用,点击启动,变成激活状态即可;若点击启动无法激活OPC驱动,需要重新安装OPC驱动,方法如下: 下载I/O Driver文件 下载链接:https://download.csdn.net/down

Ron_Tso的博客 2759

【C语言】顺序栈-基本操作

#include<stdio.h> #include<stdlib.h> #define MAXSIZE 10 typedef struct { int data[MAXSIZE]; int top; }SqStack; //均通过传递指针的方式传参 void Create(); void Insert(SqStack *s); void Delete(SqStack *s); void ViewData(SqStack *s); int main() { Create.

LowB_Fish的博客 266

基于NE555的触摸延时开关电路设计与实现

本文详细介绍了基于NE555芯片的触摸延时开关电路设计与实现方法。通过分析NE555的单稳态工作模式,结合定时电阻、电解电容等关键元件选型,提供了一套完整的电路搭建方案。文章还包含抗干扰设计、调试技巧及常见故障处理,帮助电子爱好者快速掌握触摸延时灯的制作要点。

weixin_29268267的博客 788

第5周 项目1--建立顺序栈算法库

/*    copyright (t) 2016,烟台大学计算机与控制工程学院    *All rights reserved.    *文件名称:zxl.cpp    *作者:邹晓琳    *完成日期:2016年9月25日  *问题描述:定义顺序栈存储结构,实现其基本运算,并完成测试。     要求:     1、头文件sqstack.h中定义数据结构并声明用于完成基本

zxl2016525的博客 449

RocketMQ源码分析之消息轨迹

文章目录前言一、消息轨迹二、消息轨迹源码分析1、producer端2、consumer端三、消息轨迹中存储的信息1.TraceContext2.TraceBean3.TraceType四、总结 前言   本篇文章将会从以下方面介绍消息轨迹:什么是消息轨迹?如何启用消息轨迹?示例demo、消息轨迹的源码分析和消息轨迹中存储的信息。最后会用一张图来总结消息轨迹的工作原理。 一、消息轨迹 1.什么是消息轨迹? 消息轨迹是用来跟踪记录消息发送、消息消费的轨迹。 2.如何启用消息轨迹? broker端 需要在b

不爱学习的小妞博客 1076

GPU服务器选购避坑指南:从硬件配置到场景化性能调优

本文提供GPU服务器选购的全面指南,涵盖硬件架构解析、应用场景配置策略和性能调优实践。针对大模型训练、推理服务和科学计算等场景,详细分析GPU选型、内存带宽匹配和散热设计等关键因素,帮助技术决策者避免常见配置误区,实现成本效益最大化。

peace的博客 1029

c语言实现顺序栈

顺序栈的基本操作 顺序栈的基本操作包括顺序栈的初始化、判断栈是否为空或者满、清空栈表、进栈、出栈、读取栈顶元素、打印栈表以及求栈表长度等等运算。其中比较重要的有进栈、出栈以及读取栈顶元素。

m0_70885714的博客 6452

Allegro如何进行四层板板层设计

板层的设计

weixin_42499230的博客 3189

顺序栈和链栈的基本操作实现

一、实验目的1、熟练掌栈的结构特点,掌握栈的顺序存储和链式存储结构和实现。 2、 学会使用栈解决实际问题。 二、实验内容 自己确定结点的具体数据类型和问题规模: 分别建立一个顺序栈和链栈,实现栈的压栈和出栈操作。 三、实验步骤 1、依据实验内容分别说明实验程序中用到的数据类型的定义; 2、相关操作的算法表达; 3、完整程序; 4、总结、

IMIS_TwentyEight的博客 3091

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

顺序栈和链栈的基本操作

一、实验目的 1、   熟练掌栈的结构特点,掌握栈的顺序存储和链式存储结构和实现。 2、      学会使用栈解决实际问题。 二、实验内容 自己确定结点的具体数据类型和问题规模: 分别建立一个顺序栈和链栈,实现栈的压栈和出栈操作。 三、实验代码 1.顺序栈的源代码 const int StackSize=10; template class SeqStack {

An_Chloe的博客 1790

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【数据结构】顺序栈和链栈的基本操作(定义,初始化, 入栈,出栈,取栈顶元素,遍历,置空)

详细讲解顺序栈和链栈的初始化,入栈,出栈,取栈顶元素,遍历,置空等操作

小吉妙妙屋 1万+

数据结构— —栈的基本操作(顺序栈和链栈)

数据结构— —栈的基本操作(顺序栈和链栈)

shsjssnn的博客 1763

顺序栈和链栈的操作实现

简而言之,顺序栈就是栈的顺序存储,链栈就是栈的链式存储。

2303_78660417的博客 380

顺序栈和链栈的几个基本操作

用c++写的,初始化的时候一定要在形参列表里加上引用操作符(&),要么初始化就用双重指针进行操作。 因为:对谁操作(想要改变谁的值),就要得到谁的地址。如果不加上&的话,就无法改变 main函数里的指针 s 的值,改变的只是形参的值。 目录 顺序栈: 链栈: 顺序栈: //要注意初始化时,形参的那个引用符号(&)必须要加上!否则...

^.^ 490

栈-关于顺序栈和链栈创建的相关操作

顺序栈 链栈 1.顺序栈 #include<iostream> using namespace std; #define maxSize 10 //定义顺序栈 typedef struct { int data[maxSize]; int top; }Stack; //初始化栈 void initStack(Stack& st) { st.top = -1; } //判断栈是否为空 int isEmpty(Stack st) { if (st.top == -1) {.

qq_43392759的博客 250

数据结构----顺序栈和链栈的创建及相关操作

顺序栈和链栈的创建,入栈,出栈和栈满,栈空的判断

2201_75619538的博客 314

顺序栈和链栈的一些基础操作

顺序栈 import java.util.Scanner; public class commonStack { // 用于从键盘上获取数据 private Scanner sc = new Scanner(System.in); private stack[] stacks; private static int first,end; private boolean b = true; /** * 主函数 * @param args

Lagi_lanumoa的博客 203

栈——顺序栈和链栈的定义和基本操作

顺序存储方式实现栈代码(以s.top= -1为例) #include<stdio.h> #include<iostream> #define Maxsize 10 typedef struct{ int data[Maxsize]; //静态数组存放栈中元素 int top; //栈顶指针 ,实际当做数组下标用 }SqStack; //栈的类型定义(结构体) //基本操作,创销,增删改查,判空满 ,取栈顶元素..

weixin_44064434的博客 795

数据结构 顺序栈和链栈的操作实现(C)

顺序栈的操作实现 1、顺序栈的头文件定义和函数声明 #ifndef SEQSTACK_H #define SEQSTACK_H //数组模拟栈的存储 #define MAX_SIZE 1024 #define SEQSTACK_TRUE 1 #define SEQSTACK_FALSE 0 typedef struct SEQSTACK { void* data[MAX_SIZE]; i...

bwqiang的博客 575
上一篇: 分支限界法解决装载问题之FIFO队列方式的总结
下一篇: 顺序队列和链队列的各种操作
eric802
博客等级 码龄17年 24粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值