跟着动手,知行泛型编程
实现一个只支持int类型的Stack
Stack是一个先进后出的队列,接下来我们先从实现一个整型数据的Stack开始
- stack.h定义:
class Stack{
public:
int m_nLogicLen; //栈的实际长度
int m_nAssignLen; //栈分配的空间的长度
int *m_pElementBuffer; //栈中数据的存放空间地址
public:
Stack();
~Stack();
public:
bool StackPush(int element); //入栈
int StackPop(); //出栈
};
- stack.cpp
#include "Stack.h"
Stack::Stack(){
m_nLogicLen = 0; //初始栈的长度为0
m_nAssignLen = 4; //初始栈分配的空间大小为4*sizeof(int)
m_pElementBuffer = (int*)malloc(this->m_nAssignLen * sizeof(int));
}
Stack::~Stack(){
free(this->m_pElementBuffer);
}
/*
* @brief 向栈中添加一个元素
* @element 添加的元素
* @return true成功,false失败
*/
bool Stack::StackPush( const int element){
//如果内存初始化分配内存满了
if( this->m_nLogicLen == this->m_nAssignLen){
//内存增长策略为:每次在原先基础上扩大一倍
this->m_nAssignLen = this->m_nAssignLen * 2;
this->m_pElementBuffer = (int*) realloc(this->m_pElementBuffer,this->m_nAssignLen * sizeof(int));
//printf("address: %p", this->m_pElementBuffer);
assert(m_pElementBuffer != NULL);
}
//入栈
printf("push: %d\n",element);
this->m_pElementBuffer[m_nLogicLen] = element;
m_nLogicLen++;
return true;
}
/*
* @brief 元素出栈
* @return int 出栈的元素
*/
int Stack::StackPop(){
if( this->m_nLogicLen >= 0){
int element = this->m_pElementBuffer[this->m_nLogicLen-1];
this->m_nLogicLen --;
return element;
}
else{
printf("the stack is empty!\n");
return -1;
}
}
知识点:
- malloc realloc工作原理
以上就是一个int类型的栈的定义,只能支持int类型的数据的入栈喝出栈,如何将其转化成可以支持泛型:double、float以及自定义的struct结构体尼?
关键点:
- int* –>> void*
- 自定义数据内存开辟,如何析构?
带着这两个疑问,我们接下来将讲述如何实现一个泛型的Stack!
最后,给大家推荐一首歌,来自中国有嘻哈的GAI爷的天干物燥,程序员的生活需要一点燥!
border="0" width="330" height="86" src="//music.163.com/outchain/player?type=2&id=437387587&auto=0&height=66">