栈的核心是LIFO(Last In First Out),即后进先出

出栈和入栈只会对栈顶进行操作,栈底永远为0。如果是入栈,要将入栈元素赋值给栈数组,再将栈顶上移一位;出栈时要先将栈顶下移一位,再将栈顶元素赋值给引用

源代码:https://github.com/cjy513203427/C_Program_Base/tree/master/52.%E6%A0%88

需要实现的方法如下

#pragma once
#ifndef MYSTACK_H
#define MYSTACK_H #include<iostream>
using namespace std; class MyStack
{
public:
MyStack(int size);//分配内存初始化栈空间,设定栈容量,栈顶
~MyStack();//回收栈空间内存
bool stackEmpty();//判断栈是否为空
bool stackFull();//判断栈是否为满
void clearStack();//清空栈
int stackLength();//已有元素的个数
bool push(char elem);//元素入栈,栈顶上升
bool pop(char &elem);//元素入栈,栈顶下降
void stackTraverse(bool isAsc);//遍历栈中所有元素
private:
char *m_pBuffer;//栈空间指针
int m_iSize;//栈容量
int m_iTop;//栈顶,栈中元素个数
}; #endif // !MYSTACK_H

1.构造函数

传入数组容量赋值给成员变量m_iSize

声明一个指针,指向数组

栈顶初始化为0

MyStack::MyStack(int size)
{
m_iSize = size;
m_pBuffer = new char[m_iSize];
m_iTop = ;
}

2.析构函数

删除数组指针并置空

MyStack::~MyStack()
{
delete[]m_pBuffer;
m_pBuffer = NULL;
}

3.判空与判满

m_iTop就是栈的长度,当m_iTop为0是栈为空

m_iTop=容量时栈为满

bool MyStack::stackEmpty()
{
return == m_iTop ? true : false;//0 == m_iSize这样的写法,编译器更敏感,防止一个“=”的错误不报
} bool MyStack::stackFull()
{
return m_iTop == m_iSize ? true : false;
}

4.清空栈

将栈顶指针置空

void MyStack::clearStack()
{
m_iTop = ;
}

5.获取栈长度

int MyStack::stackLength()
{
return m_iTop;
}

6.入栈

如果栈为满,则不允许入栈

如果栈未满,将参数赋值给数组[栈顶],再将m_iTop上移一位,

返回正确结果

bool MyStack::push(char elem)
{
if (stackFull()) {
return false;
}
else {
m_pBuffer[m_iTop] = elem;
m_iTop++;
return true;
}
}

7.出栈

传入引用作为“返回值”使用,仅仅为了测试获取出栈的元素

如果栈为空,不允许出栈

如果栈不为空,先将m_iTop下移一位,因为经过入栈操作才能进行出栈操作,入栈操作已经将m_iTop上移一位,此时数组[栈顶]是一个空值,栈顶指向的元素为空

再将数组[栈顶]赋值给引用变量elem,返回正确结果

PS:这里要注意,在队列里面使用队首front和队尾rear不用考虑先+后+的问题,都是后+,先+会导致队首或者队尾指向的元素为空

bool MyStack::pop(char &elem)
{
if (stackEmpty())
{
return false;
}
else {
//先做--操作,因为入栈m_iTop++,m_iTop指向了一个空的区域
m_iTop--;
elem = m_pBuffer[m_iTop];
return true;
}
}

8.遍历

根据isAsc判断是正序还是倒序遍历

void MyStack::stackTraverse(bool isAsc)
{
if (isAsc) {
for (int i = 0; i < m_iTop; i++)
{
cout << m_pBuffer[i] << ",";
}
}
else {
for (int i = m_iTop - 1; i >= 0; i--)
{
cout << m_pBuffer[i] << ",";
}
}
}

栈C++实现的更多相关文章

  1. 通往全栈工程师的捷径 —— react

    腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...

  2. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  3. duang~免费的学习视频来啦:学霸君之全栈测试

    学霸君向童鞋们推荐一款 同名学霸学习 视频教程 重点是完全免费收看学习噢!!! 今天 学霸君推荐腾讯课堂的学霸君之全栈测试 复制下方链接至腾讯课堂中报名学习 https://ke.qq.com/cou ...

  4. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  5. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8748  Solved: 3835[Submi ...

  6. BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]

    4453: cys就是要拿英魂! Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 90  Solved: 46[Submit][Status][Discu ...

  7. BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2326  Solved: 1054[Submit][Status ...

  8. .NET全栈开发工程师学习路径

    PS:最近一直反复地看博客园以前发布的一条.NET全栈开发工程师的招聘启事,觉得这是我看过最有创意也最朴实的一个招聘启事,更为重要的是它更像是一个技术提纲,能够指引我们的学习和提升,现在转载过来与各位 ...

  9. Nodejs之MEAN栈开发(八)---- 用户认证与会话管理详解

    用户认证与会话管理基本上是每个网站必备的一个功能.在Asp.net下做的比较多,大体的思路都是先根据用户提供的用户名和密码到数据库找到用户信息,然后校验,校验成功之后记住用户的姓名和相关信息,这个信息 ...

  10. 匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置

    0x00 前言: 匹夫在日常和别人交流的时候,常常会发现一旦讨论涉及到“类型”,话题的热度就会立马升温,因为很多似是而非.或者片面的概念常常被人们当做是全面和正确的答案.加之最近在园子看到有人翻译的& ...

随机推荐

  1. jQuery制作多表格固定表头、切换表头的特效

    做了好几天的固定表头特效,总算是搞定了.先说明一下基本功能:我们在一个网页上浏览很多份表格数据的时候,肯定会碰到很多分不清表头,也分不清表 格是哪个的情况,这个时候我们就希望能有一种功能,就是我们再下 ...

  2. [NetCore学习记录]第一章.使用netcore撸个简单的增删改查

    1.引言 2.解决方案各部分介绍图 3.添加数据模型 4.添加数据库上下文 5.修改配置文件 6.使用依赖关系注入容器注册数据库上下文 7.添加基架工具并执行初始迁移 1.引言 NetCore出来有一 ...

  3. django drf SearchFilter与OrderingFilter

    View Demo from django.shortcuts import render from rest_framework.views import APIView from rest_fra ...

  4. 「SHOI2016」黑暗前的幻想乡

    题目链接 戳我 \(Describe\) \(n−1\)个公司,每个公司能修一些边,求每条边都让不同的公司来修的生成树的方案数 \(Solution\) 这道题很明显容斥.答案就是:所有都选的生成树个 ...

  5. socket-详细分析No buffer space available(转载)

    文章原文出处:http://www.cnblogs.com/hjwublog/p/5114380.html 今天在公司服务器上部署运行的后台程序出现大面积接口无法调用的问题,查看后台控制台打印如下信息 ...

  6. Ubuntu16.04 JAVA配置!

    下面是转发的文章,写得不错,不过有些地方需要注意: 1,以root身份登入,安装和配置JDK,这样JDK是全局的,其他用户也可以使用! 2,下面文章中的JDK版本应该比我们目前能够下载的要旧,我们把下 ...

  7. swoft| 源码解读系列一: 好难! swoft demo 都跑不起来怎么破? docker 了解一下呗~

    title: swoft| 源码解读系列一: 好难! swoft demo 都跑不起来怎么破? docker 了解一下呗~description: 阅读 sowft 框架源码, swoft 第一步, ...

  8. PLSQL基本操作手册

    第1章  用PLSQL连接Oracle数据库 PLSQL只能用来连接Oracle数据库(不象PB还可以连接JDBC.ODBC),所以必须首先安装并配置Oracle客户端. §1.1 初次登录PLSQL ...

  9. pandas筛选数据。

    https://jingyan.baidu.com/article/0eb457e508b6d303f0a90572.html 假如我们想要筛选D列数据中大于0的行:df[df['D']>0] ...

  10. nginx高性能WEB服务器系列之七--nginx反向代理

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...