纪念逝去的岁月——C++实现一个栈
2015-05-31 23:01
405 查看
1、代码
2、运行结果
1、代码 stack.cpp
2、编译及运行
2.1、编译
2.2运行
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 * ; 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 * ; 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语言
- 如何学好C++语言
- c++学习笔记:变量
- Visitor Pattern -- 基于编译试验抽象语法树 (C++)
- c++基础学习(04AM)
- c++设计模式之策略模式
- C语言函数调用简简介
- 一个c++题目引发的思考
- C语言小程序
- c语言中static 用法
- C语言快速排序
- 一起talk C栗子吧(第六回:C语言实例--生成随机数)
- 【C++总结】关于函数返回对象析构的问题
- volatile - C语言变量类型符
- STL源码剖析—list
- 字符串操作(C语言 C++)
- c++设计模式之外观模式
- [C/C++标准库]_[初级]_[计算结构体成员的偏移量]