当前位置: 首页 > news >正文

C/C++数据结构之用数组实现栈

概述

        要在C/C++中用数组自行实现栈,我们首先需要理解栈提供的基本操作。这些操作主要包括以下5个接口。

        Push:向栈中添加一个元素。

        Pop:从栈中移除顶部元素,并返回该元素。

        Top:查看栈顶元素但不移除它。

        IsEmpty:检查栈是否为空。

        Size:获取栈中元素的数量。

实现原理

        如果我们用固定大小的数组来实现栈,优点是简单、快速。但这样不够灵活,容量一开始就定死了。如果数据太多就会溢出,太少又浪费内存。为了更灵活地管理内存,我们可以使用new []来动态分配数组空间,就像搭积木一样,需要多少就申请多少,甚至还可以自动扩容。

        在下面栈CArrayStack的实现中,我们声明了四个成员变量,分别为:m_paData、m_nCapacity、m_nTopIndex、m_nCount。m_paData是一个动态分配的数组的地址,用来存储栈中的所有元素。m_nCapacity表示当前栈最多可以容纳多少个元素。m_nTopIndex表示当前栈顶元素的索引,也就是最后放入的那个元素的位置。m_nCount用于记录当前栈中已有的元素数量。

class CArrayStack
{
public:CArrayStack();~CArrayStack();void Push(int nValue);int Pop();int Top();bool IsEmpty();int Size();private:void Resize();private:int* m_paData;int m_nCapacity;int m_nTopIndex;int m_nCount;
};

Push操作

        进行Push操作时,首先要判断当前栈是否已经满了。如果满了,则调用扩容函数Resize,将数组容量翻倍,以容纳更多元素。然后,将栈顶指针自增,以在新位置添加新的元素。最后,更新栈中元素的数量。具体如何实现,可参考下面的示例代码。

void CArrayStack::Push(int nValue)
{if (m_nCount == m_nCapacity){Resize();}m_paData[++m_nTopIndex] = nValue;m_nCount++;
}

Pop操作

        进行Pop操作时,首先要判断当前栈是否为空。如果为空,则直接抛出异常。然后,将栈顶指针指向的元素返回,同时将栈顶指针自减。最后,更新栈中元素的数量。具体如何实现,可参考下面的示例代码。

int CArrayStack::Pop()
{if (IsEmpty()){throw underflow_error("stack is empty");}int nValue = m_paData[m_nTopIndex--];m_nCount--;return nValue;
}

完整实现

        Top操作、IsEmpty操作、Size操作都比较简单,这里就不再赘述了。CArrayStack类的完整实现,可参考下面的示例代码。

#include <iostream>
#include <stdexcept>using namespace std;CArrayStack::CArrayStack()
{m_nCapacity = 2;m_paData = new int[m_nCapacity];m_nTopIndex = -1;m_nCount = 0;
}CArrayStack::~CArrayStack()
{delete[] m_paData;m_paData = NULL;
}void CArrayStack::Push(int nValue)
{if (m_nCount == m_nCapacity){Resize();}m_paData[++m_nTopIndex] = nValue;m_nCount++;
}void CArrayStack::Resize()
{int nNewCapacity = m_nCapacity * 2;int* pNewArray = new int[nNewCapacity];for (int i = 0; i < m_nCount; ++i){pNewArray[i] = m_paData[i];}delete[] m_paData;m_paData = pNewArray;m_nCapacity = nNewCapacity;
}int CArrayStack::Pop()
{if (IsEmpty()){throw underflow_error("stack is empty");}int nValue = m_paData[m_nTopIndex--];m_nCount--;return nValue;
}int CArrayStack::Top()
{if (IsEmpty()){throw underflow_error("stack is empty");}return m_paData[m_nTopIndex];
}bool CArrayStack::IsEmpty()
{return m_nCount == 0;
}int CArrayStack::Size()
{return m_nCount;
}int main()
{CArrayStack s;s.Push(66);s.Push(77);s.Push(88);cout << "Top element: " << s.Top() << endl;cout << "Pop: " << s.Pop() << endl;cout << "Pop: " << s.Pop() << endl;cout << "Current size: " << s.Size() << endl;cout << "Is empty: " << (s.IsEmpty() ? "True" : "False") << endl;return 0;
}

http://www.dtcms.com/a/426836.html

相关文章:

  • Linux timekeeping
  • macOS 下安装 zsh、zsh-syntax-highlighting、powerlevel9k、nerd-font
  • CarveMe:代谢模型构建
  • windows显示驱动开发-调试间接显示驱动程序(二)
  • 企业平台网站建设制作一个网站平台
  • LinuxC++——etcd分布式键值存储系统入门
  • 使用arcgis提取评价指标时,导出数据是负数-9999
  • VUE3+element plus 实现表格行合并
  • LinuxC++——etcd分布式键值存储系统API(libetcd-cpp-api3)下载与二次封装
  • Electron vue项目 打包 exe文件2
  • 【开题答辩全过程】以 springboot高校创新创业课程体系的设计与实现为例,包含答辩的问题和答案
  • package.json详解
  • iOS 应用上架全流程解析,苹果应用发布步骤、ipa 上传工具、TestFlight 测试与 App Store 审核经验
  • QGIS + ArcGIS Pro 下载常见卫星影像及 ESRI Wayback 历史影像
  • Hexo搭建/部署个人博客教程
  • 中山 网站建设发布平台是什么
  • Qt操作Windows平板上摄像头
  • 外贸建站哪好asp网站打开很慢的原因
  • rknn yolo11 推理
  • 虚幻基础:容器
  • 开发环境windows安装oracle 19c并连接数据库
  • 虚幻基础:角色攻击
  • 手机上怎么查看网站设计淮安品牌网站建设
  • go协程的前世今生
  • GO学习2:基本数据类型 与 转换
  • 南京网站开发联系南京乐识昆明餐饮网站建设
  • 3D打印技术如何重塑PEM双极板的制造范式?
  • Excel工作表自动追加工具项目总结报告
  • AR技术赋能航空制造:开启智能装配新时代
  • 盟接之桥说制造:源头制胜,降本增效:从“盟接之桥”看供应链成本控制的底层逻辑