3.C语言和C++实现Stack的对比
1.C语言实现
#include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int DataType; typedef struct Stack { DataType* arr; int capacity;//栈的容量 int size;//栈中元素个数 }Stack; void StackInit(Stack* ps)//创建栈 { assert(ps); ps->arr = (DataType*)malloc(sizeof(DataType)* 4); if (NULL == ps->arr) { assert(0); return; } ps->capacity = 4; ps->size = 0; } void StackDestroy(Stack* ps)//销毁栈 { assert(ps); if (ps->arr) { free(ps->arr); ps->arr = 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->arr,newcapacity*sizeof(DataType)); if (temp == NULL) { perror("realloc申请空间失败!!!"); return; } ps->arr = temp; ps->capacity = newcapacity; } } void StackPush(Stack* ps, DataType data)//入栈 { assert(ps); CheckCapacity(ps); ps->arr[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->arr[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++语言实现
#include<iostream> using namespace std; typedef int DataType; class Stack { public: void Init()//创建栈 { _arr = (DataType*)malloc(sizeof(DataType)* 4); if (NULL == _arr) { perror("malloc申请空间失败!!!"); return; } _capacity = 4; _size = 0; } void Push(DataType data)//入栈 { CheckCapacity(); _arr[_size] = data; _size++; } void Pop()//出栈 { if (Empty()) return; _size--; } DataType Top()//栈顶元素 { return _arr[_size - 1]; } int Empty() //判断栈是否为空 { return 0 == _size; } int Size()//栈中元素个数 { return _size; } void Destroy()//销毁栈 { if (_arr) { free(_arr); _arr = NULL; _capacity = 0; _size = 0; } } private: void CheckCapacity()//扩容 { if (_size == _capacity) { int newcapacity = _capacity * 2; DataType* temp = (DataType*)realloc(_arr, newcapacity *sizeof(DataType)); if (temp == NULL) { perror("realloc申请空间失败!!!"); return; } _arr = temp; _capacity = newcapacity; } } private: DataType* _arr; 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语言中需要用户自己维护。
三、相关练习题
- 问题:C++中
struct
和class
的区别是什么?
答:C++需要兼容C语言,所以C++中struct
可以当成结构体使用。另外C++中struct
还可以用来定义类。和class
定义类是一样的,区别是struct
定义的类默认访问权限是public,class
定义的类默认访问权限是private。 - 结构体怎么对齐? 为什么要进行内存对齐?
答:(1)内存对齐是什么?
内存对齐是指编译器将每个数据单元安排在适当的位置的位置上。
(2)结构体怎么对齐?
结构体对齐是依照结构体内存对齐规则(本文有讲解)。
(3)为什么要进行内存对齐?
①平台原因(移植原因)
某些编译器不能对任意内存位置进行操作,所以要将数据存储在可被操作的位置。
②性能原因
如果没有内存对齐,对数据的访问要进行两次,有内存对齐,对数据的访问只要进行一次。
③总结来说,内存对齐就是用空间换时间。
④如果想要既节省时间又节省空间,就可以将占内存小的变量集中定义。 - 如何让结构体按照指定的对齐参数进行对齐?能否按照3、4、5即任意字节对齐?
可以通过使用#pragma pack()
对默认对齐数进行修改和恢复,实现让结构体按照指定的对齐参数进行对齐,因此,可以按照任意字节对齐。 - 什么是大小端?如何测试某台机器是大端还是小端?
(1)什么是大小端?
大端是指,数据存储时,高位字节存储在低地址,低位字节存储在高地址;
小端是指,数据存储时,高位字节存储在高地址,低位字节存储在低地址;
(2)如何判断某台机器是大端还是小端?
利用联合体改变一个成员变量,其他成员变量也会被修改的特点,判断大小端:
//判断当前计算机的大小端 int is_little_endian() { union Un { int a; char b; }; union Un i; i.a = 1; return i.b; } int main() { int ret = is_little_endian(); if (ret == 1) { printf("小端\n"); } if (ret == 0) { printf("大端\n"); } }
运行结果:
总结
以上就是今天要讲的内容,本文介绍了C++中的类的相关概念。本文作者目前也是正在学习C++相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。
最后,如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!