顺序栈的基本操作(存储结构设计、初始化、判空、判满、入栈、出栈、取栈顶元素、遍历输出栈内元素)

这篇具有很好参考价值的文章主要介绍了顺序栈的基本操作(存储结构设计、初始化、判空、判满、入栈、出栈、取栈顶元素、遍历输出栈内元素)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#define ElemType char
#define Status int
#define StackInitSize 100
//其实也可以写成 typedef int ElemType;

//栈的顺序结构表示
typedef struct 
{
	ElemType* base;
	ElemType* top;
	int stacksize;
}seqstack;

//初始化一个顺序栈
Status InitStack(seqstack& s)//传递的是地址
{
	s.base = (ElemType*)malloc(StackInitSize * sizeof(ElemType));
	if (!s.base) 
	{
		return 0;
	}
	s.top = s.base;
	s.stacksize = StackInitSize;
	return 1;
}

//创建栈
Status CreateStack(seqstack &s)//其实不是特别清楚什么时候传递的参数为地址
{
	int m = 0;
	char n;//n作为接收从键盘中输入的值
	printf("请输入元素,若输入完成则输入$:\n");
	//getchar();
	while (m < StackInitSize)
	{
		//scanf_s("%c", &n);
		n = getchar();
		if (n != '$')
		{
			*s.top = n;//把值放进栈里边,双重指针表非指针,嘿嘿
			s.top++;//头结点往上移动
		}
		else
			return 1;
		//scanf_s("%c", &n);
		//if (n == '$')
		//	return 1;
		//*s.top = n;//将n的值赋给top
		//s.top++;//头结点往上移动
		m++;
	}
}

//判断栈是否为空
Status StackEmpty(seqstack s)
{
	if (s.top == s.base)
		return 0;
	else
		return 1;
}

//遍历输出栈内元素
//(因为要对栈进行判空操作,则先写判空)

Status print(seqstack s)
{
	ElemType* i;
	i = s.top;//服从后进先出的原则
	if (StackEmpty(s) == 0)
	{
		printf("--此栈为空栈--\n");
		return 0;
	}
		
	while (i > s.base)
	{
		i--;
		printf("%c", *i);
	}
	printf("\n");
	return 1;
}

//进行入栈操作的编写,入栈之前需要进行判满的操作
Status PushStack(seqstack& s, ElemType& e)
{
	if (s.top - s.base == 0)//判满
	{
		printf("--此栈已满--\n");
		return 0;
	}
	else
		*s.top++ = e;//把头结点向上移动后,把e的地址作为头结点的地址域
}
//出栈,后进先出,则该元素为栈顶元素
char PopStack(seqstack& s)
{
	if (StackEmpty == 0)
	{
		printf("--此栈为空栈--\n");
		return 0;
	}
	else
	{
		char e;
		s.top--;//因为头结点指向栈顶元素的上一个节点,所以需要下移指向栈顶元素
		e = *s.top;// 实际上此元素并没真正删除,仍在S.top中,
		//但是如果插入元素,就会被更新,就像是删除了一样
		return e;
	}
}


//主函数
int main()
{
	seqstack s;
	InitStack(s);
	//printf("%d", InitStack(s));//初始化后,检验初始化是否完成
	printf("---创建一个顺序栈---\n");
	CreateStack(s);
	/*
	int a = CreateStack(s);
	printf("%d", a);//创建栈后,检验创建是否完成
	*/
	printf("---此刻栈是否为空?---\n");
	if (StackEmpty(s) == 1)
		printf("--此栈不为空--\n");
	else
		printf("--此栈为空栈--\n");
	printf("---打印这个顺序栈:---\n");
	print(s);
	
	printf("---进行入栈操作---\n");
	printf("---请输入要入栈的字母---\n");
	getchar();
	char a;
	scanf_s("%c", &a);
	PushStack(s, a);
	printf("---打印这个顺序栈:---\n");
	print(s);

	printf("---进行出栈操作---\n");
	char b;
	b = PopStack(s);//取栈顶元素
	printf("--出栈的元素是%c--\n", b);
	printf("---打印这个顺序栈:---\n");
	print(s);
	return 0;
}

以上为总的代码,对于栈满时存在一些问题待改进

————————————————————————————————————————

以下为代码编写过程,有参考网上大佬的代码

栈的基本操作-初始化、入栈、出栈、判空等,数据结构,c语言,c++,数据结构,算法

 栈的基本操作-初始化、入栈、出栈、判空等,数据结构,c语言,c++,数据结构,算法

创建栈后报错,在scanf_s处缺少&符号 

栈的基本操作-初始化、入栈、出栈、判空等,数据结构,c语言,c++,数据结构,算法

会执行两遍创建栈?

 栈的基本操作-初始化、入栈、出栈、判空等,数据结构,c语言,c++,数据结构,算法

在主函数里边确实有两个 

栈的基本操作-初始化、入栈、出栈、判空等,数据结构,c语言,c++,数据结构,算法

修改后,基本逻辑没有问题,但是需要输出栈的元素,才能够进一步确定是否成功创建栈

遍历输出栈的元素,首先需要对栈进行判空操作,则首先进行判空

//判断栈是否为空
Status StackEmpty(seqstack s)
{
	if (s.top == s.base)
		return 0;
	else
		return 1;
}
//输入栈是否为空
void PrintStackEmpty(seqstack s)
{
	if (StackEmpty(s) == 1)
		printf("--此栈不为空--\n");
	else
		printf("--此栈为空栈--\n");
}

 本来想在主函数里简单化,但是吧,输出就太简单了

printf("---此刻栈是否为空?---\n");
	void PrintStackEmpty(seqstack s);

栈的基本操作-初始化、入栈、出栈、判空等,数据结构,c语言,c++,数据结构,算法

 这是为什么呢?

先检验一下吧,

printf("---此刻栈是否为空?---\n");
	if (StackEmpty(s) == 1)
		printf("--此栈不为空--\n");
	else
		printf("--此栈为空栈--\n");

栈的基本操作-初始化、入栈、出栈、判空等,数据结构,c语言,c++,数据结构,算法

栈的基本操作-初始化、入栈、出栈、判空等,数据结构,c语言,c++,数据结构,算法

两种情况都为空,emmm,直觉告诉我是在创建栈的时候出现了问题

 栈的基本操作-初始化、入栈、出栈、判空等,数据结构,c语言,c++,数据结构,算法

 对比网上资源之后发现,是在传递参数时,别人传的时地址,我传的是结构体,但是吧其实不是特别清楚什么时候传递的参数为地址

修改后,

//创建栈
Status CreateStack(seqstack &s)//其实不是特别清楚什么时候传递的参数为地址
{
	int m = 0;
	char n;//n作为接收从键盘中输入的值
	printf("请输入元素,若输入完成则输入$:\n");
	//getchar();
	while (m < StackInitSize)
	{
		//scanf_s("%c", &n);
		n = getchar();
		if (n != '$')
		{
			*s.top = n;//把值放进栈里边,双重指针表非指针,嘿嘿
			s.top++;//头结点往上移动
		}
		else
			return 1;
		//scanf_s("%c", &n);
		//if (n == '$')
		//	return 1;
		//*s.top = n;//将n的值赋给top
		//s.top++;//头结点往上移动
		m++;
	}
}

栈的基本操作-初始化、入栈、出栈、判空等,数据结构,c语言,c++,数据结构,算法

栈的基本操作-初始化、入栈、出栈、判空等,数据结构,c语言,c++,数据结构,算法

 成功了哦,哈哈哈,再稍微修改一下下

栈的基本操作-初始化、入栈、出栈、判空等,数据结构,c语言,c++,数据结构,算法

修改之后发现

栈的基本操作-初始化、入栈、出栈、判空等,数据结构,c语言,c++,数据结构,算法

咋说呢

栈的基本操作-初始化、入栈、出栈、判空等,数据结构,c语言,c++,数据结构,算法

不止一条语句,要花括号括起来,检验的重要性

 接下来进行入栈操作,入栈之前需要进行判满的操作

//进行入栈操作的编写,入栈之前需要进行判满的操作
Status PushStack(seqstack& s, ElemType& e)
{
	if (s.top - s.base == 0)//判满
		return 0;
	else
		*s.top++ = e;//把头结点向上移动后,把e的地址作为头结点的地址域
}

栈的基本操作-初始化、入栈、出栈、判空等,数据结构,c语言,c++,数据结构,算法

出栈

//出栈,后进先出,则该元素为栈顶元素
char PopStack(seqstack& s)
{
	if (StackEmpty == 0)
	{
		printf("--此栈为空栈--\n");
		return 0;
	}
	else
	{
		char e;
		s.top--;//因为头结点指向栈顶元素的上一个节点,所以需要下移指向栈顶元素
		e = *s.top;// 实际上此元素并没真正删除,仍在s.top中,
		//但是如果插入元素,就会被更新,就像是删除了一样
		return e;
	}
}

取栈顶元素和即为栈顶元素出栈文章来源地址https://www.toymoban.com/news/detail-743130.html

到了这里,关于顺序栈的基本操作(存储结构设计、初始化、判空、判满、入栈、出栈、取栈顶元素、遍历输出栈内元素)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【头歌】顺序栈的基本操作及应用

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

    2024年02月02日
    浏览(75)
  • 栈的定义及基本操作实现(顺序栈)

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

    2023年04月08日
    浏览(61)
  • 【数据结构】(顺序表)C语言实现线性表顺序存储的创建、插入、删除、查找、输出等基本操作(附完整代码)

    要求:利用书本上的线性表的顺序存储结构定义 #define MAXSIZE 100 //顺序表可能达到的最大长度 typedef struct{ ElemType *elem; // 存储空间基址 int length; // 当前长度 int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位) } SqList; 1)编写完成下列功能的函数: (1)初始化一个线性表

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

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

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

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

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

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

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

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

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

    🌈个人主页: 秦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日
    浏览(42)
  • 二叉树的顺序存储及基本操作

    1、在树中除根结点外,其余结点分成m(m≥0)个(A)的集合T1,T2,T3…Tm,每个集合又都是树,此时结点T称为Ti的父结点,Ti称为T的子结点(1≤i≤m)。 A、互不相交B、可以相交C、叶节点可以相交D、树枝结点可以相交 2、在一棵度为3的树中,度为3的结点数为2个,度为2的结点

    2024年02月06日
    浏览(37)
  • 线性表的基本操作及在顺序存储及链式存储的实现

    一个数据结构的基本操作是指其最核心、最基本的操作。其他较复杂的操作可通过其基本操作来实现。线性表的主要操作如下 注意:1:基本操作的实现取决于采用哪种存储结构,存储结构不同,算法的实现也不同 2:“” 表示c++中的引用调用。若存入的变量是指针变量,且

    2024年02月13日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包