首页 > 其他分享 >栈和队列

栈和队列

时间:2023-10-19 16:23:04浏览次数:25  
标签:const 队列 ElemType bool 模板 指针

先进后出, 后进现出

  • 限定仅在表的一端进行插入和删除操作的线性表

操作

  • 初始化
  • 入栈
  • 出栈
  • 取值
  • 判断栈满栈空
  • 双栈共享

顺序栈

// 顺序栈类模板
template<class ElemType>
class SqStack 
{
protected:
// 数据成员:
	ElemType *elems;												// 元素存储空间
	int maxSize;													// 栈最大元素个数
	int count;														// 元素个数

public:
// 抽象数据类型方法声明及重载编译系统默认方法声明:
	SqStack(int size = DEFAULT_SIZE);								// 构造函数模板
	virtual ~SqStack();												// 析构函数模板
	int Length() const;												// 求栈长度			 
	bool Empty() const;												// 判断栈是否为空
	void Clear();													// 将栈清空
	void Traverse(void (*visit)(const ElemType &)) const;			// 遍历栈
	bool Push(const ElemType &e);									// 入栈
	bool Top(ElemType &e) const;									// 返回栈顶元素
	bool Pop(ElemType &e);											// 出栈
	bool Pop();														// 出栈
	SqStack(const SqStack<ElemType> &source);						// 复制构造函数模板
	SqStack<ElemType> &operator =(const SqStack<ElemType> &source);	// 重载赋值运算符
};

判断栈满:count = maxSize
判断栈空:count = 0

链式栈

表头作为栈顶好,入栈方便

// 链栈类模板
template<class ElemType>
class LinkStack 
{
protected:
// 数据成员:
	Node<ElemType> *top;												// 栈顶指针
	int count;															// 元素个数

public:
// 抽象数据类型方法声明及重载编译系统默认方法声明:
	LinkStack();														// 无参数的构造函数模板
	virtual ~LinkStack();												// 析构函数模板
	int Length() const;													// 求栈长度			 
	bool Empty() const;													// 判断栈是否为空
	void Clear();														// 将栈清空
	void Traverse(void (*visit)(const ElemType &)) const ;				// 遍历栈
	bool Push(const ElemType &e);										// 入栈
	bool Top(ElemType &e) const;										// 返回栈顶元素
	bool Pop(ElemType &e);												// 出栈
	bool Pop();															// 出栈
	LinkStack(const LinkStack<ElemType> &source);						// 复制构造函数模板
	LinkStack<ElemType> &operator =(const LinkStack<ElemType> &source);	// 重载赋值运算符
};

入栈:

  1. 建立新的栈顶
  2. 新栈顶指针指向旧栈顶
  3. 栈顶指针赋值新栈顶
  4. 栈元素+1

出栈:

  1. 备份旧栈顶
  2. 栈顶指针赋值旧栈顶->next
  3. 删除旧栈顶

队列

仅在表的一端进行插入,在表的另一端删除
先进先出

队头:删除元素
队尾:插入元素

基本操作:

  1. 入队
  2. 出队
  3. 读取队头元素值
  4. 求队长
  5. 建队列
  6. 判断队满、队空

链队列

需要两个指针frontrear 指向队列队头和队尾

链表头作为队头、链表尾作为队尾好,便于入队出队

为方便加上头接点

入队:

  1. 旧队尾指向新队尾
  2. 队尾指针指向新队尾

出队:

  1. 备份旧队首;
  2. 队首指针赋值指旧队首next
  3. 删除旧队首指针

循环队列(处理顺序链表队列)

顺序链表队列问题:假溢出问题

解决:

  1. 平移,发生假溢出将所有元素移到开头
  2. 使用动态数组,重新分配空间
  3. 使用环形数组
front = (front + 1)%MAXSIZE;
rear = (rear + 1) & MAXSIZE;

当到达顺序表尾时将数据加到开头

但是队列满和空的条件仍相同

解决:

  1. 标志位
  2. 计数器
  3. 少用一个空间,尾指针+1 = 头指针作为队列满的条件

应用

  1. 表达式求值

表达式包括:

  • 操作数
    • 常数
    • 标识符
  • 运算符
    • 算数
    • 逻辑
    • 关系
  • 界限符
    • 括号
    • 结束符

解法:

  1. 设定两栈:操作数或运算结果栈、运算符栈

  2. 操作符的优先级

  3. 序列检测

标签:const,队列,ElemType,bool,模板,指针
From: https://www.cnblogs.com/0x000001/p/17774993.html

相关文章

  • c# Queue 队列的基本使用
    C#中的 Queue 是一种基于链表的先进先出(FIFO)数据结构。以下是一个简单的 Queue 实例:///<summary>///普通队列///</summary>publicvoidQueueShow(){//创建一个QueueQueue<string>queue=newQu......
  • 实验五 队列的基本操作及应用
    实验五队列的基本操作及应用作业要求:实验时间:第7、8周实验目的:掌握队列的初始化、判空、取队头元素、出队、入队、输出队列元素等基本操作实验要求:1、认真阅读和掌握教材上和本实验相关的算法。2、上机将链队列或循环队列的相关算法实现。3、实现下面实验内容要求的功能,并......
  • 用Java语言简单实现MQ消息队列服务
    大致的结构:一个消息队列大致的结构:消息处理中心Brokerpackagecom.tntxia;importjava.util.concurrent.ArrayBlockingQueue;/***消息处理中心*/publicclassBroker{//队列存储消息的最大数量privatefinalstaticintMAX_SIZE=3;//保存消息数据......
  • 队列queue
    队列queue(包含头文件queue)首先说说什么是queue,queue就像是一根管子,数据可以从管子尾部进入,然后从头部出来,不能倒车从尾部出来,并且数据只能从尾部进入,不能从头部进入1.队列的定义queue<队列内输入的数据类型,队列的容器类型>变量名;queue<int>s;//创建一个类型为int变量名......
  • 数据结构之队列(优先队列)
    概念优先队列(PriorityQueue)为一种不必遵守队列特性FIFO(先进先出)的有序线性表,其中每个元素都赋予一个优先级(Priority),加入元素时可任意加入,但有最高优先级者(HighestPriorityOutFirstHPOF)则最先输出。 Java在Java中,PriorityQueue类实现了这样的一种有序队列。PriorityQue......
  • 数据结构之队列(双向队列)
    概念双向队列(Double-endsQueues简称Dequeue)是一种前后2端都可以添加数据(入队)、移除(出队)数据的有序线性表。特点双向队列(Deque,全名DoubleEndedQueue)是一种具有两个指针的线性表,允许从两端都可以进行插入和删除操作即双向队列可以在任意一端进行元素的插入和删除操作,而单向队......
  • 《Mastering the FreeRTOS Real Time Kernel》读书笔记(3)队列管理
    4.队列管理队列,在一些系统中被称为消息队列,可以理解为信息中转站。是任务和任务,任务和中断之间可以互相读和写的一个共享空间。4.2队列的特征存储数据队列本质上是一个先进先出的缓冲区(FIFO),所以可以存储一定容量的数据。有两种方式可以实现FIFO队列:1.将发送给队列的数据复......
  • Redisson使用延时队列
    延时队列在开发中,有时需要使用延时队列。比如,订单15分钟内未支付自动取消。jdk延时队列如果使用jdk自带的延时队列,那么服务器挂了或者重启时,延时队列里的数据就会失效,可用性比较差。Redisson延时队列可以使用Redisson的延时队列。Redisson的配置,详情见:https://blog.csdn.n......
  • 王道408---DS---线性表、栈、队列与数组
    错题2.21、题目中提到在第i个位置一般是指在下表为i的位置2、线性表元素的序号是从1开始,而在第n+1个位置插入相当于在表尾追加。静态链表树的双亲表示法就是使用了这种思想吧卡特兰数\[\text{}\frac1{n+1}C_{2n}^{n}\]栈的数学性质:n个不同元素进栈,出栈元素不同排列的个......
  • golang之异步队列Asynq
    Asynq[1]是一个Go实现的分布式任务队列和异步处理库,基于redis,类似Ruby的sidekiq[2]和Python的celery[3]。Go生态类似的还有machinery[4]和goworker同时提供一个WebUI asynqmon[5],可以源码形式安装或使用Dockerimage,还可以和Prometheus集成dockerrun--rm--nameasynqmon......