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

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。如果你有闲暇时间,可以做个知识拓展。

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

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值