栈C++实现

栈的核心是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 = 0;
}

2.析构函数

删除数组指针并置空

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

3.判空与判满

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

m_iTop=容量时栈为满

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

bool MyStack::stackFull()
{
    return m_iTop == m_iSize ? true : false;
}
复制代码

4.清空栈

将栈顶指针置空

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

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判断是正序还是倒序遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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] << ",";
        }
    }
}

 

posted @   Rest探路者  阅读(425)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
levels of contents
点击右上角即可分享
微信分享提示