#include <iostream>
#include <string>

//链表结构
template <typename T>
struct Node
{
    T data;
    Node<T>* next = nullptr;
};

//定义栈抽象类LinkStack
template <typename T>
class LinkStack
{
public:
    LinkStack();
    ~LinkStack();
public:
    bool isEmpty();
    int size();
    void push(T&& data);
    T pop();
    T top();
private:
    Node<T>* phead = nullptr;
    int count;
};

template <typename T>
LinkStack<T>::LinkStack()
        :phead(new Node<T>),count(0)
{
    std::cout << std::hex << this << std::dec << ": run LinkStack constructor" << std::endl;
    std::cout << "new Node phead: " << std::hex << phead << std::dec <<std::endl;
};

template <typename T>
LinkStack<T>::~LinkStack()
{
    std::cout << std::hex << this << std::dec <<": run LinkStack destructor" << std::endl;
    Node<T> * temp = nullptr;
    while (nullptr != phead)
    {
        temp = phead->next;
        std::cout << "delete Node: " << std::hex << phead << std::dec << " -> " << phead->data  << std::endl;
        delete phead;
        phead = temp;
    }
};
//栈大小
template <typename T>
int LinkStack<T>::size()
{ return count; };

//空栈
template <typename T>
bool LinkStack<T>::isEmpty()
{ return count == 0; };


//插入
template <typename T>
void LinkStack<T>::push(T&& data)
{
    Node<T> *pnode = new Node<T>;
    std::cout << " -->> new Node: " << std::hex << pnode << std::dec <<std::endl;
    std::cout << "     push data: " << data << std::endl;
    pnode->data = data;
    pnode->next = phead->next;
    phead->next = pnode;
    count++;
};

//弹出
template <typename T>
T LinkStack<T>::pop()
{
    if(nullptr != phead->next) //判断空栈
    {
        Node<T>* pdel = phead->next;
        std::cout << " <<-- delete Node: " << std::hex << pdel << std::dec <<std::endl;
        std::cout << "         pop data: " << pdel->data << std::endl;
        phead->next = phead->next->next;
        T data = std::move(pdel->data);
        delete pdel;
        count--;
        return data;
    } else
        throw std::out_of_range("空栈"); 
};

//获取栈顶元素
template <typename T>
T LinkStack<T>::top()
{
    if(nullptr != phead->next)
        return phead->next->data;
    else
        throw std::out_of_range("空栈"); 
};

int main()
{
    LinkStack <std::string> lstack;
    std::cout << "new lstack: " << std::hex << &lstack << std::dec <<std::endl;
    lstack.push("LinkStack Hello");
    lstack.push("0123456789");
    lstack.push("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    lstack.push("abcdefghijklmnopqrstuvwxyz");

    std::cout << "Stack.size()=" << lstack.size() << std::endl;
    std::cout << "Stack top data=" << lstack.top() << std::endl;
    
    //输出栈
    while(!lstack.isEmpty())
    { lstack.pop(); }
    
    //int lstack2
    auto lstack2 = new LinkStack<int>;
    std::cout << "new lstack2: " << std::hex << lstack2 << std::dec <<std::endl;
    lstack2->push(100);
    lstack2->push(200);
    lstack2->push(300);
    lstack2->push(400);
    lstack2->push(500);
    lstack2->push(600);

    std::cout << "Stack2->size()=" << lstack2->size() << std::endl;
    std::cout << "Stack2 top data=" << lstack2->top() << std::endl;
    
    //弹出栈顶元素
    lstack2->pop();
    
    delete lstack2;
    std::cout << "delete lstack2: " << std::hex << lstack2 << std::dec <<std::endl;
    
    return 0;
}

Tag: none

Add a new comment.