数据结构学习——栈
2016-01-01 16:31
393 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tongyunzhao/article/details/50445242
顺序栈
vector实现
链式栈
考试前复习下数据结构,把一些知识点整理在这!主要参考了殷人昆主编的《数据结构(用面向对象方法与C++语言描述)》这本书,以及中山大学刘聪老师的课件内容!
概念与性质
一些概念
栈是只允许在表的末端进行插入和删除的线性表。
- 栈顶:允许插入和删除的一端
- 栈底:不允许插入和删除的一端
- 空栈:栈中没有任何元素的栈
栈的性质
由于栈是一种运算受限的线性表,只允许在表的一端进行插入删除,所以栈具有一些特殊的性质。给定栈S=(a1, a2, …, an),则最后加入栈的元素an为栈顶,按a1, a2, …, an的顺序进栈,出栈的顺序则刚好相反,即an先出栈,a1最后出栈。这样的性质可以概括为先进后出(FILO),或者叫后进先出(LIFO),两种说法都可以,但是我比较习惯FILO。
栈的操作
栈有几个主要的操作:
- 建立一个空栈(构造函数Stack());
- 在栈顶添加一个新元素,如果栈未满(push() );
- 在栈顶删除一个元素,如果栈不空(pop() );
- 检查栈是否空(isEmpty());
- 取得栈顶元素,如果栈不空(Top())。
栈的抽象数据类型主要有两种存储表示:基于数组的存储表示(顺序栈)和基于链表的存储表示(链式栈)。
顺序栈
基于数组的存储表示实现的栈称为顺序栈。
数组实现
template <typename T> class Stack { private: const static int MAX_ELEMENT_COUNT = 1000; int elementCount; T elements[MAX_ELEMENT_COUNT]; public: Stack() : elementCount(0) {} bool isFull() { return elementCount >= MAX_ELEMENT_COUNT; } bool isEmpty() { return elementCount == 0; } void push(T element) { if (isFull()) { cout << "The stack is full. Can not push any element now." << endl; return; } elements[elementCount] = element; elementCount++; } void pop() { if (isEmpty()) { cout << "The stack is empty. Can not pop any element now." << endl; return; } elementCount--; } T top() { if (isEmpty()) { throw runtime_error("No data in stack."); } return elements[elementCount-1]; } };
vector实现
template <typename T> class Stack { private: vector<T> elements; public: Stack() {} bool isEmpty() { return elements.size() == 0; } void push(T element) { elements.push_back(element); } void pop() { if (isEmpty()) { cout << "The stack is empty. Can not pop any element now." << endl; return; } elements.pop_back(); } T top() { if (isEmpty()) { throw runtime_error("No data in stack."); } return elements[elements.size() - 1]; } };
链式栈
基于链表的存储表示实现的栈称为链式栈。
template <typename T> class Stack { private: LinkedList<T> elements; public: Stack() {} bool isEmpty() { return elements.isEmpty(); } void push(T element) { elements.addFirst(element); } void pop() { if (isEmpty()) { cout << "The stack is empty. Can not pop any element now." << endl; return; } elements.removeFirst(); } T top() { if (isEmpty()) { throw runtime_error("No data in stack."); } return elements.getFirst(); } };
注:模板类LinkedList的实现在上一篇博客《数据结构学习——线性表》中,查看上一篇博客
相关文章推荐
- 数据结构学习之链表(单向、单循环以及双向)(递归实现)
- 数据结构学习时的零散算法
- 《数据结构与算法——C语言实现》学习笔记——归并排序
- 我的c 数据结构学习之旅 顺序表未完
- Network学习7_Java之Pcap文件解析(二:建立数据结构)
- 学习严蔚敏数据结构: 第一集
- 数据结构学习之堆栈(链式存储)
- 【学习点滴 -数据结构-二叉树】 二叉树的遍历(全)
- 数据结构学习笔记 --- 队列(链队列)
- 数据结构学习笔记 --- 图(最短路径)
- 算法与数据结构的一些学习体会
- 新手学习数据结构与算法---链表多项式
- 数据结构和算法学习之路
- STL数据结构学习笔记
- 数据结构学习笔记(二) 链表之带表头结点的单循环链表基本操作
- 数据结构学习笔记--(3) 链表--第一节
- Java语言学习-数据结构接口
- 数据结构之二叉搜索树和二叉平衡树学习笔记
- 共同学习Java源代码-数据结构-HashMap(十五)
- 数据结构和算法-学习笔记4