首页 > 编程语言 >【奇妙的数据结构世界】用图像和代码对堆栈的使用进行透彻学习 | C++

【奇妙的数据结构世界】用图像和代码对堆栈的使用进行透彻学习 | C++

时间:2023-01-29 13:31:45浏览次数:42  
标签:return top C++ 栈底 base 堆栈 数据结构 指针

image.png

第十章 堆栈


::: hljs-center

目录

第十章 堆栈

●前言

●一、堆栈是什么?

1.简要介绍

●二、堆栈操作的关键代码段

1.类型定义

2.顺序栈的常用操作

3.链式栈的常用操作

●总结

:::

前言

简单来说,数据结构是一种辅助程序设计并且进行优化的方法论,它不仅讨论数据的存储与处理的方法,同时也考虑到了数据彼此之间的关系与运算,从而极大程度的提高程序执行的效率,减少对内存空间的占用等。不同种类的数据结构适用于不同的程序应用,选择合适正确的数据结构,可以让算法发挥出更大的性能,给设计的程序带来更高效率的算法。


一、堆栈是什么?

1.简要介绍

堆栈是一组相同的数据类型的组合,所有的操作均在堆栈的顶端去进行,具有后进先出的特性。它是一种抽象的数据结构,具有两个显著特性:①只能从栈顶去进行存取数据的操作;②数据的存取符合后进先出的原则;栈它可以分为顺序栈和链式栈两种类型,它们在不同的问题中都会有广泛的应用。要特别注意链式栈指针域的指针指向,它与基本的链表有一定的差异。两种数据结构的类型如下图所示: image.png

二、堆栈操作的关键代码段

1.类型定义

①顺序栈存储结构的定义

typedef struct {
	selemtype* base;    //栈底指针
	selemtype* top;    //栈顶指针
	int stacksize;		//堆栈大小
}sqstack;

②链式栈存储结构的定义

typedef struct stacknode{
	selemtype data;  //数据元素
	struct stacknode* next;  //指针域
}stacknode,*linklist;
linklist s;   //指针

2.顺序栈的常用操作

①顺序栈的初始化

image.png

void initstack(sqstack& s)
{
	s.base = new selemtype[maxsize];   //开拓一块新的堆栈区域,大小需要事先声明,并且将栈底指针指向栈底
	if (!s.base) {
		exit(0);  
	}   //创建失败
	else {
		s.top = s.base;   
		s.stacksize = maxsize;
	}   //创建成功,初始时需要将栈底指针的位置赋给栈顶指针,给栈一个空间大小
}

②判断顺序栈是否为空

image.png

bool emptystack(sqstack& s)
{
	if (s.base == s.top) {
		return true;
	}   //如果栈底指针和栈顶指针指向同一个位置的话,也就是初始化下的状态时,就是空的
	else {
		return false;
	}    //反之不为空
}

③ 求顺序栈的长度

image.png

int lengthstack(sqstack& s)
{
	int length = s.top - s.base;  //头指针所在的位置减去尾指针所在的位置
	return length;
}

④ 清空顺序栈

image.png

void clearstack(sqstack& s)
{
	if (s.base)
		s.top = s.base;  
	//判断如果栈底指针存在,那么直接将栈底的位置赋到栈顶指针的位置即可,就好比初始化下的状态
}

⑤ 销毁顺序栈

image.png

void destorystack(sqstack& s)
{
	if (s.base)
	{
		delete s.base;   
		s.stacksize = 0;  
		s.base = s.top = NULL;   //最终两个指针指向一块空的区域
	}
	//判断如果栈底指针存在,那么就说明这个栈存在,然后将栈底指针指向的那块删除,栈的长度直接修改为0即可
}

⑥顺序栈的入栈

image.png

int pushstack(sqstack& s,selemtype e)
{
	if (s.top-s.base<s.stacksize) {   //如果此刻栈中元素的长度小于我们栈的总长度,那么说明可以继续入栈
		*s.top = e;   //将新数据入栈到栈顶
		s.top++;   //将栈顶指针向上移动
		return 1;
	}
	else {
		return 0;
	}
}

⑦顺序栈的出栈

image.png

int popstack(sqstack& s, selemtype e)
{
	if (s.base == s.top) {   //空栈
		return 0;
	}
	else {
		s.top--;   //将栈顶指针向下移动
		e = *s.top;  //将出栈元素的数据内容保存
		return 1;
	}
}

3.链式栈的常用操作

①链栈的初始化

image.png

void initstack(linkstack& s)
{
	s = NULL;   //链式栈的初始化
}

②判断链栈是否为空

image.png

bool emptystack(linkstack& s)
{
	if (s == NULL)    //初始化下的状态就是一个空栈
		return true;
	else
		return false;
}

③链栈的入栈

image.png

int push(linkstack& s,selemtype e)
{
	linkstack p;
	p = new stacknode;   //创建在链式栈中的新结点
	p->data = e;  //将要入栈的数据元素赋给结点的数据域
	p->next = s;  //链式栈中指针域是向前指的,所以将新结点的指针域指它前面s指针所指向的位置
	s = p;    //再将指针s后移,进行下次的操作
	return 1;
}

④链栈的出栈

image.png

int pop(linkstack& s, selemtype e)
{
	if (s == NULL) {
		return 0;
	}
	else {
		linkstack p;
		e=s->data;
		p = s;   
		s = s->next;
		delete p;
		return 1;
	}
}

⑤取栈顶元素

image.png

selemtype gettop(linkstack &s)
{
	if (s != NULL)   //栈顶指针存在
		return s->data;   //取出此刻栈顶的数据元素
}

总结

以上就是我们这节对堆栈的全部学习,堆栈的基本运算我在上面基本都已经讲到,希望可以对你有所帮助。我认为图形与代码的结合是学习数据结构算法的核心关键。用图来理解代码,用代码来实现图形。这样不光可以很好的提高我们的代码编程能力,还可以提高我们的抽象逻辑思维能力。

<您的三连和关注是我最大的动力>

标签:return,top,C++,栈底,base,堆栈,数据结构,指针
From: https://blog.51cto.com/zhangzhichaoya/6024031

相关文章

  • 数据结构
    数据结构一、相关概念程序=数据结构+算法算法:对特定问题求解方法和步骤的一种描述,是指令的有限序列算法的描述:自然语言流程图:传统流程图、NS流程图(盒图)伪代码程序......
  • A+B Problem C++
    前言继上次发表的A+BProblemC语言后,今天我们来学习一下A+BProblemC++正文什么是C++?C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的......
  • MacOS 环境下 VSCode 的 C++ 环境搭建
    编译器安装编译器可以选择Clang或者GCC,在MacOS上Clang的安装更为简单一些。Clang(推荐)打开终端输入命令,clang-v查看是否已经安装。如果已经安装,会输出类似......
  • VSCode无法跳转C++头文件解决
    问题VSCode安装c++插件后可以在源码与头文件之间跳转(Alt+O)非常方便。突然某天特定的workspace失效,无论如何重装插件活VSCode都不能复原。解决既然其他workspace正常......
  • 【C++ 数据结构:链表】二刷LeetCode707设计链表
    【C++链表】使用c++重新写一遍LeetCode707设计链表目的是熟悉c++中链表的操作知识点C++链表节点的实现在c++中,一般通过结构体来定义链表的节点,也需要写构造函数(使用初......
  • C++ const pointer
    在C++中const限定的指针类型常常令人困惑,现整理如下,以整型为例,主要区分如下三个例子constint*p;int*constp;constint*constp;其实就是2种情况,const在int前......
  • 关于 Dev-C++ 中缺少 iconv.h 的问题
    前言在C++中有个扩展库ext,里面有一些黑科技(hash,splay,binomial_heap等等),在Windows环境中,我们运行Dev-C++并在头文件写#include<bits/extc++.h>时,经常会收到......
  • leetcode_数据结构_入门_118. 杨辉三角
    118.杨辉三角给定一个非负整数numRows,生成「杨辉三角」的前numRows行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。方法一:数学思路及解法......
  • leetcode_数据结构_入门_566. 重塑矩阵
    566.重塑矩阵 在MATLAB中,有一个非常有用的函数reshape,它可以将一个 mxn矩阵重塑为另一个大小不同(rxc)的新矩阵,但保留其原始数据。给一个由二维数组mat表示......
  • C++函数文档注释模板
    还是.net好,///就解决了点击查看代码///<summary>///在指定的node结点之后插入新结点,如果node为NULL,表示新结点插在链表第一个结点之前///</summary>///<paramna......