text.h
#ifndef TEXT_H
#define TEXT_H#include <stdexcept> // 用于 std::out_of_rangetemplate <typename T>
class MyStack {
private:T* data; // 指向底层数组的指针int capacity; // 容量int top; // 栈顶索引int size; // 当前元素数量void resize(int new_capacity); // 扩容函数public:// 无参构造函数MyStack();// 有参构造函数MyStack(int initial_capacity);// 拷贝构造函数MyStack(const MyStack& other);// 赋值运算符MyStack& operator=(const MyStack& other);// 析构函数~MyStack();// 访问第一个元素T& front();// 访问最后一个元素T& back();// 检查栈是否为空bool is_empty() const;// 返回栈的元素数量int get_size() const;// 尾插void push(const T& value);// 尾删void pop();// 在尾部原位置构造元素template<typename... Args>void emplace_back(Args&&... args);// 删除首个元素void pop_front();// 交换内容void swap(MyStack& other);};#include "text.cpp" // 包含实现文件#endif // TEXT_H
text.cpp
#include "text.h"// 无参构造函数
template <typename T>
MyStack<T>::MyStack() : capacity(10), top(-1), size(0) {data = new T[capacity]; // 动态分配初始容量
}// 有参构造函数
template <typename T>
MyStack<T>::MyStack(int initial_capacity) : capacity(initial_capacity), top(-1), size(0) {data = new T[capacity]; // 动态分配指定容量
}// 拷贝构造函数
template <typename T>
MyStack<T>::MyStack(const MyStack& other) : capacity(other.capacity), top(other.top), size(other.size) {data = new T[capacity]; // 动态分配新数组for (int i = 0; i <= top; i++) {data[i] = other.data[i]; // 复制元素}
}// 赋值运算符
template <typename T>
MyStack<T>& MyStack<T>::operator=(const MyStack& other) {if (this != &other) { // 防止自赋值delete[] data; // 释放原有内存capacity = other.capacity;top = other.top;size = other.size;data = new T[capacity]; // 动态分配新数组for (int i = 0; i <= top; i++) {data[i] = other.data[i]; // 复制元素}}return *this; // 返回当前对象
}// 析构函数
template <typename T>
MyStack<T>::~MyStack() {delete[] data; // 释放动态分配的内存
}// 访问第一个元素
template <typename T>
T& MyStack<T>::front() {if (is_empty()) {throw std::out_of_range("Stack is empty");}return data[0]; // 返回第一个元素
}// 访问最后一个元素
template <typename T>
T& MyStack<T>::back() {if (is_empty()) {throw std::out_of_range("Stack is empty");}return data[top]; // 返回最后一个元素
}// 检查栈是否为空
template <typename T>
bool MyStack<T>::is_empty() const {return size == 0; // 如果元素数量为0,返回true
}// 返回栈的元素数量
template <typename T>
int MyStack<T>::get_size() const {return size; // 返回当前元素数量
}// 尾插
template <typename T>
void MyStack<T>::push(const T& value) {if (size >= capacity) {resize(capacity * 2); // 扩容为原来的两倍}data[++top] = value; // 插入新元素size++; // 更新元素数量
}// 尾删
template <typename T>
void MyStack<T>::pop() {if (is_empty()) {throw std::out_of_range("Stack is empty");}top--; // 移除栈顶元素size--; // 更新元素数量
}// 在尾部原位置构造元素
template <typename T>
template<typename... Args>
void MyStack<T>::emplace_back(Args&&... args) {if (size >= capacity) {resize(capacity * 2); // 扩容为原来的两倍}data[++top] = T(std::forward<Args>(args)...); // 原位置构造元素size++; // 更新元素数量
}// 删除首个元素
template <typename T>
void MyStack<T>::pop_front() {if (is_empty()) {throw std::out_of_range("Stack is empty");}for (int i = 0; i < top; i++) {data[i] = data[i + 1]; // 移动元素}top--; // 移除首个元素size--; // 更新元素数量
}// 交换内容
template <typename T>
void MyStack<T>::swap(MyStack& other) {std::swap(data, other.data);std::swap(capacity, other.capacity);std::swap(top, other.top);std::swap(size, other.size);
}// 扩容函数
template <typename T>
void MyStack<T>::resize(int new_capacity) {T* new_data = new T[new_capacity]; // 动态分配新数组for (int i = 0; i <= top; i++) {new_data[i] = data[i]; // 复制旧数据}delete[] data; // 释放旧内存data = new_data; // 更新指针capacity = new_capacity; // 更新容量
}
main.cpp
#include <iostream>
#include "text.h"using namespace std;int main() {MyStack<double> stack; // 创建一个整型栈// 尾插元素stack.push(99.99);stack.push(10.11);stack.push(88.88);stack.push(66.66);std::cout << "输出最后一个元素 " << stack.back() << std::endl;std::cout << "输出第一个元素 " << stack.front() << std::endl;std::cout << "输出长度 " << stack.get_size() << std::endl;// 删除首个元素stack.pop_front();std::cout << "输出删除后的第一个元素 " << stack.front() << std::endl;// 尾删元素stack.pop();std::cout << "删除后的最后一个元素 " << stack.back() << std::endl; // 交换内容MyStack<double> stack2;stack2.push(4.99);stack2.push(1.11);stack.swap(stack2);std::cout << "输出交换后的stack的最后一个元素 " << stack.back() << std::endl; std::cout << "输出交换后的stack2的最后一个元素 " << stack2.back() << std::endl; return 0;
}