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

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

前言

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


一、堆栈是什么?

1.简要介绍

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


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

1.类型定义

①顺序栈存储结构的定义

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

②链式栈存储结构的定义

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

2.顺序栈的常用操作

①顺序栈的初始化

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

②判断顺序栈是否为空

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

③ 求顺序栈的长度

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

④ 清空顺序栈

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

⑤ 销毁顺序栈

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

⑥顺序栈的入栈

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

⑦顺序栈的出栈

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

3.链式栈的常用操作

①链栈的初始化

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

②判断链栈是否为空

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

③链栈的入栈

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

④链栈的出栈

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;
  }
}

⑤取栈顶元素

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

总结

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


目录
相关文章
|
3月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
239 0
|
10天前
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
29 4
|
1月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
241 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
1月前
|
NoSQL Redis C++
Redis的实现五:二叉堆的数据结构和TTL、c,c++的实现
这篇文章详细探讨了二叉堆的数据结构及其在C和C++中的实现,特别强调了二叉堆在Redis中实现TTL(生存时间)功能的重要性,并通过代码示例展示了如何在Redis中使用二叉堆来管理键的过期时间。
41 0
|
2月前
|
C++
继续更新完善:C++ 结构体代码转MASM32代码
继续更新完善:C++ 结构体代码转MASM32代码
|
2月前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
|
2月前
|
C++
2合1,整合C++类(Class)代码转换为MASM32代码的平台
2合1,整合C++类(Class)代码转换为MASM32代码的平台
|
2月前
|
前端开发 C++ Windows
C++生成QML代码与QML里面集成QWidget
这篇文章介绍了如何在C++中生成QML代码,以及如何在QML中集成QWidget,包括使用Qt Widgets嵌入到QML界面中的技术示例。
|
5天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
25 5
|
11天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
40 4

热门文章

最新文章

下一篇
无影云桌面