【栈与队列】之栈的顺序存储(图文详细介绍!!)

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

前言:本章基于《大话数据结构》和王卓老师的视频内容,为刚接触数据结构的初学者提供一些帮助。

💕如果我的文章对你有帮助,点赞、收藏、留言都是对我最大的动力


目录

4.1 栈的定义

4.2 栈的抽象数据类型

4.3 栈的顺序存储结构及实现

4.4 完整代码


4.1 栈的定义

栈:是限定仅在表尾进行插入和删除操作的线性表

允许插入和删除的一端称为栈顶,另一端称为栈底。

空栈:不包含任何数据元素的栈称为空栈。

栈又称为后进先出的线性表,简称LIFO结构。

进栈(插入操作):也称为压栈、入栈。

出栈(删除操作):也叫做弹栈。

栈的入栈和出栈的顺序规律,第四章 栈和队列,数据结构,链表

栈的入栈和出栈的顺序规律,第四章 栈和队列,数据结构,链表

举例:有三个整数1、2、 3依次进栈,会出现几种出栈次序呢?

  • 第一种:1、2、3进,再3 、2、 1出
  • 第二种: 1进, 1出 ,2进, 2出, 3进,3出。也就是进一个就出一个,出栈为1、2、3。
  • 第三种: 1进,  2进,  2出,1出, 3进,3出。出栈次序为2、1、3。
  • 第四种:1进,1出,2进,3进,3出,2出。出栈次序为1、3、2。
  • 第五种:1进,   2进,  2出,3进,3出,1出。出栈次序为2、3、1。

栈与一般线性表的异同:

                         一般线性表
逻辑结构                             一对一 一对一
存储结构                         顺序表、链表 顺序栈、链栈
运算规则                             随机存取 后进先出

4.2 栈的抽象数据类型

ADT Stack{

  数据对象:D={|属于Elemset,(i=1,2,3...,n,n0}

  数据关系:R={<,>|,,属于D,(i=2,3,...,n)}

                    约定an端为栈顶,a1端为栈底。

  基本操作:初始化、进栈、出栈、取栈顶元素等

}ADT Stack

4.3 栈的顺序存储结构及实现

存储方式:同一般线性表的顺序存储结构完全相同,利用一组地址连续的存储单元依次存放自栈底 到栈顶的数据元素。栈底一般在低地址端。

top指针,指示栈顶元素在顺序栈中的位置。 base指针,指示栈底元素在顺序栈中的位置。

stacksize表示栈可使用的最大容量。

栈的入栈和出栈的顺序规律,第四章 栈和队列,数据结构,链表

 栈的结构定义:

#define MAXSIZE 100
typedef struct{
    SElemType *base;//SElemType是自定义类型,base是栈底指针
    SElemType *top;//top是栈顶指针
    int stacksize;//栈可用最大容量
}SqStack;

顺序栈的初始化:

Status lnitStack(SqStack& S)//这里的S不是结构体指针所以下面可以不用S->
{
	S.base = (SElemType*)malloc(MAXSIZE*sizeof(SElemType));//动态分配
	//S.base = new SElemType[MAXSIZE];//C++的分配,这里其实是指向数组的首元素的地址
	
	if (!S.base)
		exit(OVERFLOW);//存储失败
	S.top = S.base;//栈顶指针等于栈底指针
	S.stacksize = MAXSIZE;
	return OK;
}

判断顺序栈是否为空:

算法分析:栈为空的话,top指针==base指针

栈的入栈和出栈的顺序规律,第四章 栈和队列,数据结构,链表

Status StackEmpty(SqStack S)
{
	if (S.top = S.base)//如果栈顶和栈底相等,则为空
		return TRUE;
	else
		return FALSE;
}

求顺序栈的长度:

算法分析:S.stacksize=S.top-S.base

栈的入栈和出栈的顺序规律,第四章 栈和队列,数据结构,链表

int StackLength(SqStack S)
{
	return S.top - S.base;
}

清空顺序栈:

Status ClearStack(SqStack S)
{
	if (S.base)S.top = S.base;//base存在这样一个地址,则top指针下移
	return OK;
}

销毁顺序栈:

Status DestroyStack(SqStack& S)
{
	if (S.base)
	{
		delete S.base;//我们在删除一个指针之后,编译器只会释放该指针所指向的内存空间,而不会删除这个指针本身。
		//free(S.base);
		S.stacksize = 0;
		S.base = S.top = NULL;//不设置为空,则成为野指针
	}
	return OK;
}

顺序栈的入栈:

算法分析:

  1. 判断是否栈满,若满则出错(上溢)
  2. 元素e压入栈顶
  3. 栈顶指针加1

栈的入栈和出栈的顺序规律,第四章 栈和队列,数据结构,链表

Status Push(SqStack& S, SElemType e)
{
	if (S.top - S.base == S.stacksize)//栈满
		return ERROR;
	*S.top++ = e;//取值,然后给他赋值,然后S.top++
	return OK;
}

顺序栈的出栈:

算法分析:

  1. 判断是否栈空,若满则出错(上溢)
  2. 获取栈顶元素e
  3. 栈顶指针减1

栈的入栈和出栈的顺序规律,第四章 栈和队列,数据结构,链表文章来源地址https://www.toymoban.com/news/detail-773338.html

Status Pop(SqStack& S, SElemType& e)//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK
{
	if (S.top == S.base)//等价于if(StackEmpty(S))
		return ERROR;
	e = *--S.top;//相当与--S.top; e=*S.top
	return OK;
}

4.4 完整代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

#include <malloc.h>
#define MAXSIZE 100
#define OK 1
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define ERROR 0
typedef int  SElemType;
typedef int Status;

//顺序栈的初始化
typedef struct
{
	SElemType* base;//栈底指针
	SElemType* top;//栈顶指针
	int stacksize;//栈可用最大容量
}SqStack;
Status lnitStack(SqStack& S)//这里的S不是结构体指针所以下面可以不用S->
{
	S.base = (SElemType*)malloc(MAXSIZE*sizeof(SElemType));//动态分配
	//S.base = new SElemType[MAXSIZE];//C++的分配,这里其实是指向数组的首元素的地址
	
	if (!S.base)
		exit(OVERFLOW);//存储失败
	S.top = S.base;//栈顶指针等于栈底指针
	S.stacksize = MAXSIZE;
	return OK;
}
//顺序栈判断栈是否为空
Status StackEmpty(SqStack S)
{
	if (S.top = S.base)//如果栈顶和栈底相等,则为空
		return TRUE;
	else
		return FALSE;
}
//求顺序栈的长度
int StackLength(SqStack S)
{
	return S.top - S.base;
}
//清空顺序栈
Status ClearStack(SqStack& S)
{
	if (S.base)
		S.top = S.base;//base存在这样一个地址,则top指针下移
	return OK;
}
//销毁顺序栈
Status DestroyStack(SqStack& S)
{
	if (S.base)
	{
		delete S.base;//我们在删除一个指针之后,编译器只会释放该指针所指向的内存空间,而不会删除这个指针本身。
		//free(S.base);
		S.stacksize = 0;
		S.base = S.top = NULL;//不设置为空,则成为野指针
	}
	return OK;
}

//顺序栈的入栈
Status Push(SqStack& S, SElemType e)
{
	if (S.top - S.base == S.stacksize)//栈满
		return ERROR;
	*S.top++ = e;//取值,然后给他赋值,然后S.top++
	return OK;
}

//顺序栈的出栈
Status Pop(SqStack& S, SElemType& e)//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK
{
	if (S.top == S.base)//等价于if(StackEmpty(S))
		return ERROR;
	e = *--S.top;
	return OK;
}
//顺序栈的遍历
Status printList(SqStack S)
{
	SElemType* p;

	if (S.top == S.base) {
		printf("Stack is NULL.\n");
		return 0;
	}
	p = S.top;
	// 由栈顶依次向下遍历
	while (p > S.base) {
		p--;
		printf("%d ", *p);
	}
	printf("\n");
	return 1;

}
int main()
{
	SqStack S;
	SElemType e,n,i;
	lnitStack(S);//初始化
	printf("input the length of the Stack :\n");
	scanf("%d", &n);
	for (i = 1; i <= n; i++) {
		scanf("%d", &e);
		Push(S, e);//入栈
	}
	printList(S);//遍历
	printf("长度为:%d\n",StackLength(S));
	ClearStack(S);//清空栈
	printList(S);
	printf("长度为:%d\n", StackLength(S));
	DestroyStack(S);//销毁栈
	printList(S);
	printf("长度为:%d", StackLength(S));

}

到了这里,关于【栈与队列】之栈的顺序存储(图文详细介绍!!)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Java 数据结构之栈、队列(头歌平台,详细注释)

    目录 第1关:实现基于数组的 任务描述 相关知识 栈 栈的数组表示 Java 泛型简介 泛型方法 泛型类应用场景示例 代码:  第2关:实现基于链表的栈 任务描述 相关知识 栈的链式存储 入栈 出栈 代码:  第3关:基于数组的队列 任务描述 相关知识 队列 队列的数组实现 循环队列

    2024年04月25日
    浏览(41)
  • 高效学习数据结构之栈和队列篇(五千字超详细教程)

    大家好呀我是小生🙉🙊🙈今天我们来学习 数据结构的栈和队列 ,小生为了方便大家理解特意附上了 许多图片和源码 一起加油吧 🥳🥳🥳   下面是我们今天要学习的内容 🥳🥳🥳  一.栈          1.🏠栈的基本概念 ​2.🏠栈的结构选择 🚀顺序表和链表的优缺点对比:

    2023年04月08日
    浏览(64)
  • 数据结构之栈和队列 - 超详细的教程,手把手教你认识并运用栈和队列

    栈:后进先出 队列:先进先出 栈:是一种特殊的 线性表 , 只允许在固定的一端插入或者删除元素 ,一个栈包含了栈顶和栈底。只能在栈顶插入或者删除元素。 栈的底层 是由 数组 实现的。 栈遵循先入后出原则,也就是先插入的元素得到后面才能删除,后面插入的元素比

    2024年02月07日
    浏览(78)
  • 头歌(C语言)-数据结构与算法-栈的实现-第1关:实现一个顺序存储的栈

    任务描述 相关知识 栈的基本概念 栈结构的定义(C) 顺序栈的操作 编程要求 测试说明 任务描述 本关任务是实现 step1/SeqStack.cpp 中的 SS_IsFull 、 SS_IsEmpty 、 SS_Length 、 SS_Push 和 SS_Pop 五个操作函数,以实现判断栈是否为满、是否为空、求栈元素个数、进栈和出栈等功能。 相关

    2024年02月07日
    浏览(60)
  • 数据结构之栈的实现(附源码)

    目录 一、栈的概念及结构 ​二、栈的实现 三、初学栈的练习题 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插

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

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

    2024年01月23日
    浏览(48)
  • 初阶数据结构之栈的实现(五)

    👻作者简介:M malloc,致力于成为嵌入式大牛的男人 👻专栏简介:本文收录于 初阶数据结构 ,本专栏主要内容讲述了初阶的数据结构,如顺序表,链表,栈,队列等等,专为小白打造的文章专栏。 👻相关专栏推荐:LeetCode刷题集,C语言每日一题。 本章我将详细的讲解关于

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

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

    2024年02月05日
    浏览(41)
  • 【数据结构】详谈队列的顺序存储及C语言实现

    大家好,很高兴又和大家见面啦!!! 在上一篇内容中,我们在介绍完队列的基本概念、重要术语以及基本操作后,又回顾了一下数据结构的三要素——数据的逻辑结构、数据的存储结构以及数据的运算。 队列这种数据结构我们已经介绍了它的逻辑结构以及数据运算的定义

    2024年01月21日
    浏览(73)
  • 头歌(C语言)-数据结构与算法-队列-第1关:实现一个顺序存储的队列

    任务描述 相关知识 顺序存储的队列 顺序队列的主要操作 编程要求 测试说明 任务描述 本关任务:实现 step1/SeqQueue.cpp 中的 SQ_IsEmpty 、 SQ_IsFull 、 SQ_Length 、 SQ_In 和 SQ_Out 五个操作函数,以实现判断队列是否为空、是否为满、求队列长度、队列元素入队和出队等功能。 相关知

    2024年02月06日
    浏览(142)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包