纪念逝去的岁月——C++实现一个栈
C++ 实现 一个 纪念
2023-09-11 14:18:54 时间
1、代码
2、运行结果
1、代码 stack.cpp
#include <stdio.h> #include <string.h> class ClsStack { private : void ** __m_Data; int __m_pos; size_t __m_memsize; protected : int __resize(size_t n); size_t __doublesize(size_t n); public : ClsStack(size_t n = 0); ~ClsStack(); int pop(void ** ppData); int top(void ** ppData); int push(void * pData); void clear(); }; ClsStack::ClsStack(size_t n) { __m_Data = NULL; __m_pos = -1; __m_memsize = 0; if(0 != n) { __m_Data = new void * [n]; if(NULL != __m_Data) { __m_memsize = n; } } } ClsStack::~ClsStack() { if(NULL != __m_Data) { delete __m_Data; __m_Data = NULL; } __m_pos = -1; __m_memsize = 0; } size_t ClsStack::__doublesize(size_t n) { size_t x = 0; if(0 == n) { x = 1; } else { x = n * 2; } return x; } int ClsStack::__resize(size_t n) { void ** p = new void * [n]; if(NULL == p) { return -1; } memset(p, 0, sizeof(void *) * (n)); if(NULL != __m_Data) { if( NULL == memcpy(p, __m_Data, __m_memsize * sizeof(void *))) { delete p; return -1; } delete __m_Data; } __m_Data = p; __m_memsize = n; return 0; } int ClsStack::pop(void ** ppData) { if(NULL == ppData) { return -1; } int r = 0; if(-1 == __m_pos) { *ppData = NULL; r = -1; } else { *ppData = __m_Data[__m_pos --]; r = 0; } return r; } int ClsStack::top(void ** ppData) { if(NULL == ppData) { return -1; } int r = 0; if(-1 == __m_pos) { *ppData = NULL; r = -1; } else { *ppData = __m_Data[__m_pos]; r = 0; } return r; } int ClsStack::push(void * pData) { if(__m_pos + 1 >= __m_memsize) { size_t n = __doublesize(__m_memsize); if(0 != __resize(n)) { return -1; } } __m_Data[++__m_pos] = pData; return 0; } void ClsStack::clear() { if(NULL != __m_Data && 0 != __m_memsize) { delete __m_Data; } __m_Data = NULL; __m_pos = -1; __m_memsize = 0; } int main() { ClsStack objStack; int x = 10; int * p = &x; objStack.push(p); int i = 0; for(i = 0; i <= 10; i++) { int * z = new int; *z = i; objStack.push(z); } for(i = 10; i >= 0; i--) { int * z = NULL; int r = objStack.pop((void **)&z); if(NULL == z) { printf("z == NULL\n"); continue; } if(i == *z) { printf("RIGHT\n"); } else { printf("WRONG\n"); } delete z; } int * g = NULL; int r = objStack.pop((void **)&g); if(x == *g) { printf("RIGHT\n"); } else { printf("WRONG\n"); } return 0; }
2、编译及运行
2.1、编译
g++ -g -o stack stack.o
2.2运行
RIGHT
RIGHT
RIGHT
RIGHT
RIGHT
RIGHT
RIGHT
RIGHT
RIGHT
RIGHT
RIGHT
RIGHT
相关文章
- C++实现读写文件
- 从实现装饰者模式中思考C++指针和引用的选择
- Win10系列:VC++调用自定义组件1
- C++实现车轮轨迹
- java实现第二届蓝桥杯地铁换乘(C++)
- C++ code:数值计算之辛普生(Simpson)法求解积分问题
- C/C++每日一练(20230407)
- C语言/C++基础之樱花之歌
- C语言/C++常见习题问答集锦(三十二)之六种图案的字母金字塔
- Open3D(C++) 点到平面的ICP算法实现点云精配准
- paip.提升用户体验---c++ ide 自动化注释插件的开发...
- paip.提升用户体验---c++ qt 悬浮窗实现
- 编程笔试(解析及代码实现):猴子吃桃。猴子第一天吃了若干个桃子,当即吃了一半,还不解馋,又多吃了一个…的C++、Java、Python、C#等语言代码实现
- 编程笔试(解析及代码实现):猴子吃桃。猴子第一天吃了若干个桃子,当即吃了一半,还不解馋,又多吃了一个…的C++、Java、Python、C#等语言代码实现
- 静态链表的C++实现
- 【面试攻略】C++面试-发现内存泄漏方法+解决玩家网络卡的问题
- 【华为OD机试 2023最新 】最多等和不相交连续子序列(C++)
- C++面向对象小练习
- C++11 SFINEA规则_判断类是否存在某个成员函数
- C++如何实现打开文件所在文件夹的功能(打开所在文件夹并选中文件)
- 【C++随记】浅谈编译与链接
- C++模板模式
- 第十三届蓝桥杯省赛C++A组 D 题、C++C组 F 题、Java C 组 F 题——选数异或 (AC)
- C++下基于std标准库实现配置文件的读取
- VC++实现Windows中双显示器(主屏、扩展屏)各种操作的源码工程
- ShiDianNao的c++实现