手撕STL(1)——栈的内部实现

手撕STL(1)——栈的内部实现_第1张图片

文章目录

  • 前言
  • 手动实现栈(链表存储)

前言

蒟蒻君开始写STL了…
问世间栈为何物?移步算法初探系列11——栈

手动实现栈(链表存储)

#include 
#include 
using namespace std;
// 定义链表
template <class T>
struct node {
    T num;
    node<T>* nxt;
};
template<class T>
class MyStack {
    private:
        // 栈顶元素
        node<T>* Top;
    public:
        // 构造函数:栈顶为空 
        MyStack() {
            Top = NULL;
        }
        // 析构函数:清空栈
        ~MyStack();
        // 元素入栈
        void _push(T x);
        // 栈顶出栈
        void _pop();
        // 栈顶元素
        T _top();
        // 栈中元素个数
		size_t _size(); 
        // 栈是否为空
        bool _empty();
};
template<class T>
MyStack<T> :: ~MyStack() {
    node<T>* p = Top;
    while (p != NULL) {
        Top = p;
        p = p -> nxt;
        delete Top;
    }
}
template<class T>
void MyStack<T> :: _push(T x) {
    node<T>* p = new node<T>;
    p -> num = x;
    p -> nxt = Top;
    Top = p;
}
template<class T>
void MyStack<T> :: _pop() {
    // 已经空了的话就报错
    if (_empty()) {
        throw"_empty";
    }
    node<T>* t = Top;
    Top = Top -> nxt;
    delete t;
}
template<class T>
T MyStack<T> :: _top() {
    return Top -> num;
}
template<class T>
size_t MyStack<T> :: _size() {
	node<T> *p = Top;
	size_t sizes = 0;
	while (p != NULL) {
		p = p -> nxt;
		++sizes;
	}
	return sizes;
}
template<class T>
bool MyStack<T> :: _empty() {
    return Top == NULL;
}
int main() {
	// 测试 
	MyStack<int> S;
	S._push(1);
	cout << S._top() << '\n';
	S._push(2);
	cout << S._size() << '\n';
	S._pop();
	cout << S._empty() << '\n';
	return 0;
}

手撕STL(1)——栈的内部实现_第2张图片

你可能感兴趣的:(算法,链表,C++,栈,STL,算法)