您的位置:首页 > 编程语言 > C语言/C++

栈 (Stack) 的C++实现(链表方法)

2015-11-22 23:44 429 查看

项目源代码

本文项目源代码可在此处下载(Visual Studio 2013项目文件):https://github.com/Voyager2718/Blog/tree/master/stack

简介

栈 (Stack) 是一种先进后出 (LIFO - Last in, first out) 的数据结构。

先进先出的意思很简单,比如:

假设我们往一个栈依次插入 1 2 3 4 5,那么当我们取出的时候将是 5 4 3 2 1。因为 5 是最后一个插入的元素,所以我们可以说 5 是在栈头。因此当我们取出栈元素的时候,总是先取出 5,然后是 4, 3, 2, 1。

相对于链表等数据结构,栈的实现难度较低,在特定场合使用效率也比较高

其实栈可以说是一个简单化的单向链表,你也可以看一下这篇关于单向链表的文章:/article/7556468.html

栈的类定义

template<typename T>
class stack  {
private:
struct _node{
T element;
_node *next;
};
_node *_pnode;
int _size;
public:
stack() :_size(0), _pnode(nullptr) {}
~stack(){ empty(); }
void push(T);
T pop(void);
T get(void);
int size(void);
void empty(void);
bool isEmpty(void);
};


插入数据

template <typename T>
void stack<T>::push(T element){
_node *node = new _node();
node->element = element;
if (_size == 0)
node->next = nullptr;
else
node->next = _pnode;
_pnode = node;
_size++;
}


取出并删除头数据

template<typename T>
T stack<T>::pop(void){
if (_size == 0)
throw new IndexOutOfRangeException();
T t = _pnode->element;
_node *tmp_node = _pnode;
_pnode = _pnode->next;
delete (tmp_node);
_size--;
return t;
}


取得头数据(不删除)

template <typename T>
T stack<T>::get(void){
if (_size == 0)
throw new IndexOutOfRangeException();
return _pnode->element;
}


获得栈长度

template <typename T>
int stack<T>::size(){
return _size;
}


清空栈

template <typename T>
void stack<T>::empty(){
if (_size == 0)
return;
_node *tmp_node = _pnode;
while (tmp_node->next != nullptr)
{
tmp_node = tmp_node->next;
delete(_pnode);
_pnode = tmp_node;
}
delete(_pnode);
_pnode = nullptr;
_size = 0;
}


确定栈是否为空

template <typename T>
bool stack<T>::isEmpty(){
return _size == 0;
}


Exception 的定义

class Exception{
private:
string message;
public:
Exception(string message){
this->message = string(message);
}

Exception(){}

string getMessage(){
return message;
}
};

class IndexOutOfRangeException :public Exception{};


调用例子

int main(int argc, char *argv[]){
stack<int> *st = new stack<int>();
st->push(10);
st->push(20);
cout << st->pop() << endl;
cout << st->pop() << endl;
cout << st->pop() << endl;
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: