纪念逝去的岁月——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
复制代码

 

posted @   fengbohello  阅读(725)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示