栈 (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"); }
相关文章推荐
- 017--VS2013 C++ 排序贴图
- 016--VS2013 C++ 透明动画
- 015--VS2013 C++ 游戏循环的另一种方式
- 014--VS2013 C++ c++定时动画
- C++写的一个链表程序
- [C++/STL] string字符串关于copy函数的C4996错误
- C++编译运行多个文件形式的程序
- 常见排序算法的C语言实现之堆排序
- Basic Calculator II | LeetCode 48ms C++ Solution
- 在C++中使用GOLANG的协程
- C++迭代开发流程的理解
- 013--VS2013 C++ 地图贴图-其它格式图片
- [C++]分数计算器(四则运算)class
- C++ virtual 继承
- C++ virtual 继承
- C++virtual继承
- C++中的explicit关键字
- VC++老是提示“致命错误:无法打开头文件AFXRES.H”怎么回事 提示在另一个编辑器中打开,怎么解决
- c++ STL 算法库用法
- c语言输出的%