C++语言实现顺序栈

在写C语言实现顺序栈的时候,我已经向大家介绍了栈的特点以及介绍了栈的相关操作,并利用C语言实现了相关算法。在这里小编就不在继续给大家介绍了,需要温习的可以去我的博客看看。在这篇博客我就给大家分享一下利用C++模板类来实现顺序栈的相关操作,主要实现了以下功能:

私有成员的封装

根据顺序栈的特点,封装了elements这样的数组存放栈中元素,top代表栈顶指针,maxSize代表栈的最大容纳量,其中还封装了一个overflowProcess()函数来对栈的溢出进行处理。

   private:
T* elements;//存放栈中元素的数组
int top;//栈顶元素的指针
int maxSize;//栈的最大容纳元素个数
void overflowProcess();//栈的溢出处理操作

overflowProcess()函数的实现如下
在栈满的情况下,按照最大容纳量的2倍来扩展栈的容纳量,重新分配空间赋值给elements数组。

template <class T>
inline void Stack<T>::overflowProcess()
{
this->maxSize = int (2*this->maxSize);
T * temp = new T [this->maxSize];
for(int i = 0; i <= this->top ; i++){
temp[i] = this->elements[i];
}
delete []elements; //释放原来的空间
this ->elements = temp;
}

公有函数的封装

栈的操作自然少不了进栈,出栈,判空,判满等相关操作,下面分别给大家进行介绍:

无参构造函数

默认最大容纳量为10,可自行进行调整。

template<class T> Stack<T>::Stack()
{
this ->maxSize = 10;
this ->top = -1;
this ->elements = new T[this ->maxSize];
if(elements==NULL){
cout<<"动态分配错误!"<<endl;
}
}

有参构造函数

根据自身传递size大小来分配储存空间

template <class T>
inline Stack<T>::Stack(int size)
{
this ->maxSize = size;
this ->top = -1;
this ->elements = new T[this ->maxSize];
if(elements==NULL){
cout<<"动态分配错误!"<<endl;
}
}

顺序栈的“入栈”操作

入栈操作前,首先要判断栈是否溢出,如果栈isFull(),则进行溢出处理,否则将其插入到栈顶。

template <class T>
inline void Stack<T>::Push(const T &x)
{
if(isFull()==true){
cout<<"The stack is full , so need to enlarge 2x!"<<endl;
overflowProcess();//溢出处理,调整空间大小
elements[++top]=x;
} else{
elements[++top]=x;//将x入栈
}
}

顺序栈的“出栈”操作

栈顶元素出栈,如果栈为空返回false;若栈不为空,栈顶元素出栈,top指针减一就OK啦。

template <class T>
inline bool Stack<T>::Pop(T& x)
{
if(isEmpty())return false; else{ x=getTopelements(); top--;
return true;
}
}

顺序栈的“判满”

判断栈是否满,只需要将top指针与最大容纳量进行比较就行,如果满返回true,未满返回false

template <class T>
inline bool Stack<T>::isFull()
{
if(this->getTop()<this->getMaxsize()-1){
return false;
}
else{
return true;
}
}

顺序栈的“判空”

判断栈是否空,直接判断top指针,如果满返回true,未满返回false

template <class T>
inline bool Stack<T>::isEmpty()
{
if(this->getTop()==-1){
return true;
}
else{
return false;
}
}

打印顺序栈的元素

template <class T>
inline void Stack<T>::print()
{
if(isEmpty()){ cout<<"This Stack is empty!"<<endl;
}
cout<<"栈的元素为:"<<endl;
for(int i=0;i<getTop();i++)
{
cout<<"["<<elements[i]<<"]<-";
}
cout<<"["<<elements[getTop()]<<"]"<<endl; }

到这里C++实现顺序栈的文章就结束了,相对而言还是挺简单的,完整的代码我已经上传到github(C++实现顺序栈),欢迎Star! 本来打算把顺序栈的应用也写在这篇文章一起的,工作量实在挺大,也害怕大家接受不了,所以我就后面在更新喽。其他的数据结构的分享大家可以来我的博客,我们一起讨论,我也是一个学生,如果有写的不好的地方,还忘各路大神提出来,我加以改正!

C++语言实现顺序栈的更多相关文章

  1. C语言实现顺序栈

    C语言实现顺序栈,顺便加深刻++i,++i的区别 #include <stdio.h>#include <stdlib.h>#define maxsize 100/*写在前面的 ...

  2. C语言实现顺序栈以及栈的特点

    什么是栈? 同顺序表和链表一样,栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构,如下图所示. 从上图我们看到,栈存储结构与之前所学的线性存储结构有所差异,这缘于栈对数据 ...

  3. C语言实现顺序栈的初始化&进栈&出栈&读取栈顶元素

    /*顺序表实现栈的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define Stack_Size 50 //设栈中元素个数为50 ...

  4. 数据结构(C语言版)顺序栈相关算法的代码实现

    这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的 ...

  5. 纯C语言实现顺序栈

    #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef int SElemType; typede ...

  6. 顺序栈的基本操作(C语言)

    由于现在只学了C语言所以就写这个C语言版的栈的基本操作 这里说一下 :网上和书上都有这种写法 int InitStack(SqStack &p) &p是取地址  但是这种用法好像C并不 ...

  7. 数据结构与算法之顺序栈C语言实现

    顺序栈是一种特殊的顺序表,主要操作是入栈和出栈.将顺序表加一些特定限制,就成了顺序栈. 注: 1.顺序栈C语言实现: 2.按较简单的方式实现,主要帮助理解,可在此基础上修改,更加完善: 3.提供几个简 ...

  8. 【小白成长撸】--顺序栈(C语言版)

    // 顺序栈.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h"//test1.0--栈表仅限Int类型 #include <stdio. ...

  9. 栈(顺序栈)----C语言

    栈 栈是一种运算受限的线性表,是一种先进后出的数据结构,限定只能在一端进行插入和删除操作,允许操作的一端称为栈顶,不允许操作的称为栈底 顺序栈(顺序结构) 顺序栈:用一段连续的存储空间来存储栈中的数据 ...

随机推荐

  1. 初识Flask、快速启动

    目录 一.初识Flask 1.1 什么是flask? 1.2 为什么要有flask? 二.Flask快速启动 一.初识Flask 1.1 什么是flask? Flask 本是作者 Armin Rona ...

  2. Python基础篇(二)_基本数据类型

    Python基础篇——基本数据类型 数字类型:整数类型.浮点数类型.复数类型 整数类型:4种进制表示形式:十进制.二进制.八进制.十六进制,默认采用十进制,其他进制需要增加引导符号 进制种类 引导符号 ...

  3. 【Weiss】【第03章】练习3.19:计算后缀表达式

    [练习3.19] 编写一个程序计算后缀表达式的值. Answer: 计算的方法书上说得很明白了,看代码行,没写错误检测[因为懒]. 测试代码: #include <iostream> #i ...

  4. oracle中的创建过程,函数,包

    一.创建存储过程 存储过程是在oracle中存取完成特定业务逻辑的代码块.存储过程是命名块,匿名块不存在数据库中,命名块会存储到数据库中,匿名块每次运行都需要提前编译,命名块一次存储,只会编译一次.命 ...

  5. HBU-数据库第五周作业

    第五周数据库作业 注意 MySQL的数据库名.表名.列名.别名大小写规则是这样的: 1.数据库名与表名是严格区分大小写的: 2.表的别名是严格区分大小写的: 3.列名与列的别名在所有的情况下均是忽略大 ...

  6. Java中内部类和静态内部类的区别

    内部类和静态内部类 示例 public class OuterClass { private int numPrivate = 1; public int numPublic = 2; public ...

  7. snmap弱口令攻击利用

    科普Snmap: 简单网络管理协议(SNMP) 是专门设计用于在 IP 网络管理网络节点(服务器.工作站.路由器.交换机及HUBS等)的一种标准协议,它是一种应用层协议.具体废话就不多说了,自己百度去 ...

  8. 【Vulnhub练习】Tr0ll 1

    下载: https://www.vulnhub.com/entry/tr0ll-1,100/#download 说明: Tr0ll的灵感来自OSCP实验室中不断摇曳的机器. 目标很简单,获得根目录并从 ...

  9. python学习之BeautifulSoup模块爬图

    BeautifulSoup模块爬图学习HTML文本解析标签定位网上教程多是爬mzitu,此网站反爬限制多了.随意找了个网址,解析速度有些慢.脚本流程:首页获取总页数-->拼接每页URL--> ...

  10. 01.为什么要学习Go语言

    为什么互联网世界需要Go语言 世界上已经有太多太多的编程语言了,为什么又出来一个Go语言? 硬件限制:摩尔定律已然失效 摩尔定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会 ...