数据结构学习——栈
来源:互联网 发布:淘宝网络兼职可信吗 编辑:程序博客网 时间:2024/06/01 08:18
考试前复习下数据结构,把一些知识点整理在这!主要参考了殷人昆主编的《数据结构(用面向对象方法与C++语言描述)》这本书,以及中山大学刘聪老师的课件内容!
- 概念与性质
- 一些概念
- 栈的性质
- 栈的操作
- 顺序栈
- 数组实现
- vector实现
- 链式栈
概念与性质
一些概念
栈是只允许在表的末端进行插入和删除的线性表。
- 栈顶:允许插入和删除的一端
- 栈底:不允许插入和删除的一端
- 空栈:栈中没有任何元素的栈
栈的性质
由于栈是一种运算受限的线性表,只允许在表的一端进行插入删除,所以栈具有一些特殊的性质。给定栈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的实现在上一篇博客《数据结构学习——线性表》中,查看上一篇博客
0 0
- 数据结构学习——栈
- 数据结构学习总结——数据结构概述
- 栈学习——传说中的数据结构
- 数据结构——顺序栈的学习
- 数据结构——链栈的学习
- 数据结构学习笔记1——栈
- 数据结构学习日记2——栈
- 数据结构——栈的学习
- 数据结构学习——栈与队列
- 数据结构学习——堆
- 数据结构学习——队列
- 数据结构——单链表学习
- 数据结构——递归学习
- 数据结构学习—二叉树
- 数据结构学习总结 —— 1.数据结构绪论
- C++数据结构学习笔记一——数据结构基础理论
- 数据结构学习笔记——栈和队列
- 基于java的数据结构学习手记3——栈
- Maven使用问题集
- 图像处理与计算机视觉:基础,经典以及最近发展(4)图像处理与分析
- UNIX环境高级编程——进程(三)
- 自学QT之Qt 4迁移至Qt 5
- JAVA线程间协作:Condition
- 数据结构学习——栈
- hdoj1534Schedule Problem【差分约束】
- 如何在iterm2中设置自动远程登录(附跳板机攻略)
- leetCode88:Merge Sorted Array
- 2016,我要前进
- 局域网ip
- 最常用的20个监控Linux系统性能的命令行工具
- CSS选择器相关以及CSS选择器的优先级
- 258. Add Digits