C语言和C++实现Stack有什么区别?

87 阅读3分钟

C语言和C++实现Stack的对比,我们分别看看C语言实现的栈和c++实现的栈有什么区别

  1. C语言实现
    typedef int DataType;
    typedef struct Stack
    {
     DataType* array;
     int capacity;
     int size;
    }Stack;
    void StackInit(Stack* ps)
    {
     assert(ps);
     ps->array = (DataType*)malloc(sizeof(DataType) * 3);
     if (NULL == ps->array)
     {
     assert(0);
     return;
     }
         ps->capacity = 3;
     ps->size = 0;
    }
    void StackDestroy(Stack* ps)
    {
     assert(ps);
     if (ps->array)
     {
     free(ps->array);
     ps->array = NULL;
     ps->capacity = 0;
     ps->size = 0;
     }
    }
    void CheckCapacity(Stack* ps)
    {
     if (ps->size == ps->capacity)
     {
     int newcapacity = ps->capacity * 2;
     DataType* temp = (DataType*)realloc(ps->array, 
    newcapacity*sizeof(DataType));
     if (temp == NULL)
     {
     perror("realloc申请空间失败!!!");
     return;
     }
     ps->array = temp;
     ps->capacity = newcapacity;
     }
    }
    void StackPush(Stack* ps, DataType data)
    {
     assert(ps);
     CheckCapacity(ps);
     ps->array[ps->size] = data;
     ps->size++;
    }
    int StackEmpty(Stack* ps)
    {
     assert(ps);
     return 0 == ps->size;
    }
    void StackPop(Stack* ps)
    {
     if (StackEmpty(ps))
     return;
     ps->size--;
    }
    DataType StackTop(Stack* ps)
    {
     assert(!StackEmpty(ps));
     return ps->array[ps->size - 1];
        }
    int StackSize(Stack* ps)
    {
     assert(ps);
     return ps->size;
    }
    int main()
    {
     Stack s;
     StackInit(&s);
     StackPush(&s, 1);
     StackPush(&s, 2);
     StackPush(&s, 3);
     StackPush(&s, 4);
     printf("%d\n", StackTop(&s));
     printf("%d\n", StackSize(&s));
     StackPop(&s);
     StackPop(&s);
     printf("%d\n", StackTop(&s));
     printf("%d\n", StackSize(&s));
     StackDestroy(&s);
     return 0;
    }
    

    可以看到,在用C语言实现时,Stack相关操作函数有以下共性:
    每个函数的第一个参数都是Stack*
    函数中必须要对第一个参数检测,因为该参数可能会为NULL
    函数中都是通过Stack*参数操作栈的
    调用时必须传递Stack结构体变量的地址
    结构体中只能定义存放数据的结构,操作数据的方法不能放在结构体中,即数据和操作数据****的方式是分离开的,而且实现上相当复杂一点,涉及到大量指针操作,稍不注意可能就会出错。

  2. C++实现

    typedef int DataType; class Stack { public: void Init() { _array = (DataType*)malloc(sizeof(DataType) * 3); if (NULL == _array) { perror("malloc申请空间失败!!!"); return; } _capacity = 3; _size = 0; } void Push(DataType data) { CheckCapacity(); _array[_size] = data; _size++; } void Pop() { if (Empty()) return; _size--; } DataType Top(){ return _array[_size - 1];} int Empty() { return 0 == _size;} int Size(){ return _size;} void Destroy() { if (_array) { free(_array); _array = NULL; _capacity = 0; _size = 0; } } private: void CheckCapacity() { if (_size == _capacity) { int newcapacity = _capacity * 2; DataType* temp = (DataType*)realloc(_array, newcapacity * sizeof(DataType)); if (temp == NULL) { perror("realloc申请空间失败!!!"); return; } _array = temp; _capacity = newcapacity; } } private: DataType* _array; int _capacity; int _size; }; int main() { Stack s; s.Init(); s.Push(1); s.Push(2); s.Push(3); s.Push(4);

    printf("%d\n", s.Top()); printf("%d\n", s.Size()); s.Pop(); s.Pop(); printf("%d\n", s.Top()); printf("%d\n", s.Size()); s.Destroy(); return 0; }

总结:

C++中通过类可以将数据 以及 操作数据的方法进行完美结合,通过访问权限可以控制那些方法在类外可以被调用,即封装

*,在使用时就像使用自己的成员一样,更符合人类对一件事物的认知。而且每个方法不需要传递Stack
的参数了,编译器编译之后该参数会自动还原,即C++中 Stack \参数是编译器维护的,C语言中需用用户自己维护。

技术前沿拓展

前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~