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语言中需用用户自己维护。

相关推荐

  1. C语言C++实现Stack对比什么区别

    2024-03-28 08:54:03       19 阅读
  2. C语言C++实现Stack什么区别

    2024-03-28 08:54:03       19 阅读
  3. C语言区别什么

    2024-03-28 08:54:03       9 阅读
  4. C语言字符串字符数组什么区别

    2024-03-28 08:54:03       16 阅读
  5. C语言形参实参什么区别

    2024-03-28 08:54:03       9 阅读
  6. C语言C++C#区别什么地方?

    2024-03-28 08:54:03       8 阅读
  7. C#C++什么区别

    2024-03-28 08:54:03       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-28 08:54:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-28 08:54:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-28 08:54:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-28 08:54:03       18 阅读

热门阅读

  1. Linux解压安装MongoDB

    2024-03-28 08:54:03       18 阅读
  2. 面试题-3.20

    2024-03-28 08:54:03       15 阅读
  3. 2024.3.27力扣(1200-1400)刷题记录

    2024-03-28 08:54:03       19 阅读
  4. Nacos-client 2.x 使用nginx配置

    2024-03-28 08:54:03       14 阅读
  5. Android知识 - 代码混淆ProGuard规则介绍

    2024-03-28 08:54:03       17 阅读
  6. http 超全状态码

    2024-03-28 08:54:03       17 阅读