纪念逝去的岁月——C++实现一个栈
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
作 者:fengbohello
个人网站:http://www.fengbohello.top/
E-mail : fengbohello@foxmail.com
欢迎转载,转载请注明作者和出处。
因作者水平有限,不免出现遗漏和错误。希望热心的同学能够帮我指出来,我会尽快修改。愿大家共同进步,阿里嘎多~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?