64,646
社区成员
发帖
与我相关
我的任务
分享
#pragma once
#define NULL 0
template<typename T>
class Stack
{
public:
Stack(void);
~Stack(void);
// 查看栈顶元素
T peek(void) const;
// 弹栈,并返回栈顶元素
T pop(void) const;
// 进栈
void push(const T &data) const;
// 栈是否为空
bool empty(void) const;
// 获取栈内元素个数
unsigned int eleCount(void) const;
private:
// 私有构造函数
Stack(T data, Stack<T> *node);
// 私有化复制构造函数
Stack(const Stack<T> &) {}
// 私有化赋值函数
Stack<T>& operator =(const Stack<T> &)
{
return *this
}
// 数据
T data;
// 下一个结点
Stack<T> *next;
// 栈内元素个数
static unsigned int COUNT;// 非线程安全
// 当前的栈顶元素地址
static Stack<T> *pCURRENT;// 非线程安全
};
/* 实现代码:*/
template<typename T>
unsigned int Stack<T>::COUNT = 0;
template<typename T>
Stack<T>* Stack<T>::pCURRENT = NULL;
template<typename T>
Stack<T>::Stack(T para, Stack<T> *node) : data(para)
{
this->next = node;
}
template<typename T>
Stack<T>::Stack(void)
{
Stack(T(), NULL);// 构造函数调用构造函数不能用this?
}
template<typename T>
Stack<T>::~Stack(void)
{
if (COUNT == 0) return;// 栈内有元素则逐个释放
for (Stack<T> *iter(pCURRENT), *temp(NULL); iter != NULL; )
{
temp = iter;
iter = iter->next;
::operator delete(temp);// 释放内存
}
}
template<typename T>
void Stack<T>::push(const T &data) const
{
try
{
Stack<T> *pTop = new Stack<T>(data, pCURRENT);
pCURRENT = pTop;// 更新当前结点
++COUNT;// 栈内元素个数增一
}
catch(std::bad_alloc)
{
std::cerr << "内存分配失败!";
exit(-1);
}
}
template<typename T>
T Stack<T>::peek(void) const
{
if (COUNT == 0)
{
throw std::runtime_error("stack empty!");
}
return pCURRENT->data;
}
template<typename T>
T Stack<T>::pop(void) const
{
if (COUNT == 0)
{
throw std::runtime_error("stack empty!");
}
T result(pCURRENT->data);
Stack<T> *pExpired = pCURRENT;
pCURRENT = pCURRENT->next;// 更新当前栈顶
::operator delete(pExpired);// 释放过期结点
--COUNT;// 栈内元素个数减一
return result;
}
template<typename T>
bool Stack<T>::empty(void) const
{
if (Stack<T>::COUNT == 0)
{
return true;
}
return false;
}
template<typename T>
unsigned int Stack<T>::eleCount(void) const
{
return COUNT;
}
#include "Stack.h"
#include <iostream>
#include <string>
int main()
{
Stack<std::string> sta;
sta.push("100");
sta.push("200");
sta.push("300");
std::cout << sta.eleCount() << std::endl;
std::cout << sta.pop() << std::endl;
std::cout << sta.eleCount() << std::endl;
std::cout << sta.pop() << std::endl;
std::cout << sta.eleCount() << std::endl;
std::cout << sta.pop() << std::endl;
std::cout << sta.eleCount() << std::endl;
}