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 = );
~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 = -;
__m_memsize = ; if( != 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 = -;
__m_memsize = ;
} size_t ClsStack::__doublesize(size_t n)
{
size_t x = ;
if( == n)
{
x = ;
}
else
{
x = n * ;
} return x;
} int ClsStack::__resize(size_t n)
{
void ** p = new void * [n];
if(NULL == p)
{
return -;
}
memset(p, , sizeof(void *) * (n));
if(NULL != __m_Data)
{
if( NULL == memcpy(p, __m_Data, __m_memsize * sizeof(void *)))
{
delete p;
return -;
}
delete __m_Data;
}
__m_Data = p;
__m_memsize = n; return ;
} int ClsStack::pop(void ** ppData)
{
if(NULL == ppData)
{
return -;
}
int r = ;
if(- == __m_pos)
{
*ppData = NULL;
r = -;
}
else
{
*ppData = __m_Data[__m_pos --];
r = ;
} return r;
} int ClsStack::top(void ** ppData)
{
if(NULL == ppData)
{
return -;
}
int r = ;
if(- == __m_pos)
{
*ppData = NULL;
r = -;
}
else
{
*ppData = __m_Data[__m_pos];
r = ;
} return r;
} int ClsStack::push(void * pData)
{
if(__m_pos + >= __m_memsize)
{
size_t n = __doublesize(__m_memsize);
if( != __resize(n))
{
return -;
}
}
__m_Data[++__m_pos] = pData; return ;
} void ClsStack::clear()
{
if(NULL != __m_Data && != __m_memsize)
{
delete __m_Data;
}
__m_Data = NULL;
__m_pos = -;
__m_memsize = ;
} int main()
{
ClsStack objStack;
int x = ;
int * p = &x;
objStack.push(p);
int i = ;
for(i = ; i <= ; i++)
{
int * z = new int;
*z = i;
objStack.push(z);
}
for(i = ; i >= ; 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 ;
}

2、编译及运行

  2.1、编译

g++ -g -o stack stack.o

  2.2运行

RIGHT
RIGHT
RIGHT
RIGHT
RIGHT
RIGHT
RIGHT
RIGHT
RIGHT
RIGHT
RIGHT
RIGHT

纪念逝去的岁月——C++实现一个栈的更多相关文章

  1. 纪念逝去的岁月——C++实现一个栈(使用类模板)

    这个版本是上个版本的加强版,上个版本的代码:http://www.cnblogs.com/fengbohello/p/4542912.html 目录 1.代码 2.运行结果 1.代码 1.1 调试信息 ...

  2. 纪念逝去的岁月——C++实现一个队列(使用类模板)

    1.代码 2.运行结果 1.代码 #include <stdio.h> #include <string.h> template <typename T> clas ...

  3. 纪念逝去的岁月——C/C++排序二叉树

    1.代码 2.运行结果 3.分析 1.代码 #include <stdio.h> #include <stdlib.h> typedef struct _Node { int ...

  4. 纪念逝去的岁月——C/C++二分查找

    代码 #include <stdio.h> int binarySearch(int iList[], int iNum, int iX, int * pPos) { if(NULL == ...

  5. 纪念逝去的岁月——C/C++快速排序

    快速排序 代码 #include <stdio.h> void printList(int iList[], int iLen) { ; ; i < iLen; i++) { pri ...

  6. 纪念逝去的岁月——C/C++交换排序

    交换排序 代码 #include <stdio.h> void printList(int iList[], int iLen) { ; ; i < iLen; i++) { pri ...

  7. 纪念逝去的岁月——C/C++选择排序

    选择排序 代码 #include <stdio.h> void printList(int iList[], int iLen) { ; ; i < iLen; i++) { pri ...

  8. 纪念逝去的岁月——C/C++冒泡排序

    冒泡排序 代码 #include <stdio.h> void printList(int iList[], int iLen) { ; ; i < iLen; i++) { pri ...

  9. 纪念逝去的岁月——C/C++字符串回文

    判断字符串是否是回文: 1. 输入:hello world dlrow olleh 输出:1 2. 输入:nihao hello 输出:0 代码 #include <stdio.h> #i ...

随机推荐

  1. Oracle备份及备份策略

    第二章. 了解备份的重要性 可以说,从计算机系统出世的那天起,就有了备份这个概念,计算机以其强大的速度处理能力,取代了很多人为的工作,但是,往往很多时候,它又是那么弱不禁风,主板上的芯片.主板电路.内 ...

  2. js或jquery实现页面打印可局部打印

    方法一:直接用js的打印方法 <input id="btnPrint" type="button" value="打印" onclic ...

  3. python解析RSS(feedparser)

    虽然说当今的博客已经不像前几年那么火了,但是RSS还是一项很有创造性和实用性的东西.RSS 是用于分发 Web 站点上的内容的摘要的一种简单的 XML 格式.它能够用于共享各种各样的信息.关于RSS的 ...

  4. 总结列表显示ListView知识点

    全选ListView的item条目 单选ListView的条目 多选ListView的item条目 自定义ArrayAdapter动态改变ListView的不同item样式 动态增加和删除ListVi ...

  5. Win7 Object_Header之TypeIndex解析

    在暴力搜索内存进程对象反隐藏进程这篇文章中,我们提到: Object Header偏移0×008处Type成员为对象类型值,相同类型的对象具有相同的值.  自Window  7开始, _OBJECT_ ...

  6. Android自动化压力测试之Monkey Test Android常见的错误类型及黑白名单的使用方法(四)

    Android常见的错误类型有两种 1.ANR类型 1)在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸) 2)BroadcastReceiver在10秒内没有执行完毕 2.Crash类型 1)异 ...

  7. LR通过snmp监控linux下的mysql

    LR通过snmp监控linux下的mysql 在linux底下安装配置snmp: 1.使用系统盘安装rpm包(这种方式最好) 2.在www.net-snmp.org处下载net-snmp安装(安装后有 ...

  8. ASP.Net MVC开发基础学习笔记(2):HtmlHelper与扩展方法

    一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归. ...

  9. js String对象

    字符串(String) 字符串(String)使用长度属性length来计算字符串的长度: 在字符串中查找字符串 字符串使用 indexOf() 来定位字符串中某一个指定的字符首次出现的位置: 实例 ...

  10. HTTP基础10--web(2)

    因输出值转义不完全引发的安全漏洞 实施 Web 应用的安全对策可大致分为以下两部分. 客户端的验证 Web 应用端(服务器端)的验证: 输入值验证 / 输出值转义 客户端允许篡改数据或关闭 JavaS ...