【C/C++】实现模板类数据结构 -- 栈 (亲测可用)

/* *
* 模板类: 栈结构[借助数组实现]
*/
template<typename T>
class Stack {
private:
	T *data;	/* 数组第一个元素地址,存放T类型数组元素 */
	int size;	/* 当前栈实际填充数量 */
	int capacity;	/* 最大装载量 */
public:
	Stack(int m_capacity) : size(0), capacity(m_capacity) {/* 类构造函数初始化列表进行初始化变量, 降低拷贝赋值次数 */
		zz_log("Stack constructor");
		data = new T[capacity];
		zz_log("Stack capacity: %d, memory size: %u bytes", capacity, capacity * sizeof(T));
	}

	void push(T elem) {
		if (size > capacity - 1) {
			zz_log("Stack overflow");
			return;
		}
		zz_log("Statck push [%d] elem", size);
		data[size++] = elem;
	}

	T pop() {
		zz_log("Stack pop [%d] elem", size - 1);
		return data[--size]; /* 左减减,是由于在push操作后,size进行了自增1, 为下次数据填充做准备。所以要pop时,要先向前移动一位,才是最后一位 */
	}

	int empty() {
		zz_log("Stack current elem count: %d", size);
		return size;
	}

	~Stack() {
		zz_log("Stack destructor");
		delete[] data; /* data指针所指向的内存,使用delete[]运算符释放。 */
		data = NULL;
	}
};

void test_stack() 
{
	zz_log("test_statck run");

	Stack<int> s(2);
	s.push(1);
	s.push(2);
	s.push(3);
	zz_log("pop top elem from stack: [%d]", s.pop());
}

int main()
{
	test_stack();
	return 0;
}

知识点:

在C++中,可以使用模板类来定义通用的数据结构或算法,以适应不同类型的数据。下面是定义一个模板类的基本语法:

template <typename T>
class ClassName {
    // 类的成员和方法
};

在上面的代码中,template 表示这是一个模板类的声明,T 是一个占位符类型,可以在类中使用。你可以根据需要选择其他的占位符名称,比如使用 class 关键字代替 typename

在模板类的定义中,你可以使用 T 作为类型参数来定义类的成员变量、成员函数和构造函数。例如:

template <typename T>
class Stack {
private:
    T* data;
    int size;
public:
    Stack(int capacity) {
        data = new T[capacity];
        size = 0;
    }
    
    void push(T element) {
        data[size++] = element;
    }
    
    T pop() {
        return data[--size];
    }
};

上面的代码定义了一个模板类 Stack,用于表示一个栈数据结构。T 是栈中元素的类型,可以是任意类型。在构造函数、pushpop 方法中,可以使用 T 来声明变量和参数的类型。

使用模板类时,你可以根据需要指定具体的类型参数。例如:

Stack<int> intStack(10);  // 创建一个存储整数的栈
intStack.push(5);
intStack.push(10);
int poppedInt = intStack.pop();

Stack<double> doubleStack(10);  // 创建一个存储浮点数的栈
doubleStack.push(3.14);
doubleStack.push(2.718);
double poppedDouble = doubleStack.pop();

上面的代码分别创建了一个存储整数和浮点数的栈,并进行了一些操作。

通过使用模板类,你可以在不同的类型上重用相同的代码,提高代码的复用性和灵活性。

你可能感兴趣的:(C/C++,c语言,c++,数据结构)