栈和队列
来源:互联网 发布:2016gdp 知乎 编辑:程序博客网 时间:2024/06/05 23:43
栈和队列都是操作受限制的线性表,栈只能在一端运算,队列只能在两端运算。
栈
基本概念
- 栈(stack), 后进先出(LIFO),只在一端运算。
- 栈顶(top)
- 压栈(push)
- 推出(pop)
- LIFO性质(Last-In-First-Out)
抽象数据类型
//栈的抽象数据类型template<class T>class Stack{public: void clear(); void push(const T & elem); void pop(); T top(); bool isEmpty(); bool isFull();};
实现方式
- 顺序方法,用向量(顺序表)实现
- 可能出现上溢出(overflow )和下溢出(underflow )
//顺序栈template <class T>class arrStack:public class Stack{private: int mSize; int top; T* st;public: arrStack(int size){ mSize = size; T* = new T[mSize]; top = -1; //空栈的栈顶为指标-1 } arrStack(){ top = -1; } ~arrStack(){ delete [] st; } void clear(){ top = -1; }};//压栈template<class T>bool arrStack<T>::push(const T value){ if(top >= mSize - 1){ cout << "Stack Overflow!" << endl; return false; } top++; st[top] = value; return true;}//取出栈顶元素template<class T>T arrStack<T>::top(){ return st[top];}//弹出栈顶bool arrStack<T>::top(){ if(top < 0){ cout << "Stack Underflow!" << endl; return false; } top --; return true;}
- 链式方法,用单链表实现,指针自顶向下链接。
//链式栈template <class T>class linkStack{private: T* top; int size;public: linkStack(){ top = NULL; size = 0; } ~arrStack(){ clear(); } void clear();};//压栈template<class T>bool linkStack<T>::push(const T value){ T* node = new T(value) top++; st[top] = value; return true;}//出栈template<class T>T arrStack<T>::pop(){ if(top < 0){ cout << "Stack Underflow!" << endl; return false; } T temp = st[top]; top --; return temp;}
- 时间效率,所有操作都只需要常数时间,两者相近。
- 空间效率,顺序栈需要设置一个固定长度;链式表长度可变,但是增加结构性开支。
应用
计算表达式的值
中缀表达式变成后缀表达式
- 从左到右每次读取一个字符
- 数字直接输出
- 左括号入栈
- 右括号
- 栈为空,error
- 把栈顶元素依次pop,直到遇到左括号
- 没有可以匹配的左括号,error
- 四则运算符号
- while(栈顶运算符的优先级不低于输入的运算符),弹出栈顶
- 输入的运算符入栈
- 读取完毕,依次弹出栈中剩余元素。遇左括号error。
后缀表达式求值
- 从左到右依次读取字符
- 操作数,压栈
- 运算符,两次取出栈顶,计算,结果压栈
递归(Hanoi塔问题)
函数调用
队列
基本概念
- 队列(queue), 先进先出(FIFO),在两端运算。
- 名词
- 栈顶(top)
- 压栈(push)
- 推出(pop)
实现方式
顺序方法,用向量实现
链式方法,用单链表实现
应用
调度或缓冲(邮件缓冲器)
宽度优先搜索
0 0
- 栈和队列--队列
- 【栈和队列】队列
- 栈、队列和优先队列
- 栈和队列(队列)
- 栈和队列--栈
- 【栈和队列】栈
- 栈和队列
- 栈和队列
- 表、栈和队列
- 栈和队列
- 栈和队列应用
- 栈和队列
- 栈和队列
- 栈和队列
- 栈和队列
- 栈和队列
- 队列和栈
- 栈和队列 小结
- 第10周 项目2 - 二叉树遍历的递归算法
- 第11周 项目1—(二叉树的构造)
- Linux0.11--malloc,存储桶原理
- 【软考】解析直接地址索引和间接地址索引
- 机器学习实战,第三章,临时代码
- 栈和队列
- Linux下设置ORACLE自动启动与关闭
- SQL基础学习1
- 第十周实践项目一--二叉树算法库
- 让吃货失望的菜单
- 第十周项目3--利用二叉树遍历思想解决问题(4)
- 模拟频率、数字频率、模拟角频率 之间的关系
- NDK环境搭建及单步调试注意点
- 【LeetCode OJ 004】Median of Two Sorted Arrays