栈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] << "," ; } } } |
作者:Rest探路者
出处:http://www.cnblogs.com/Java-Starter/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意请保留此段声明,请在文章页面明显位置给出原文连接
Github:https://github.com/cjy513203427
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?