#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;
}