【algo&ds】3.栈和队列
1.堆栈
堆栈(Stack):具有一定操作约束的线性表(只在一端(栈顶,Top)做插入、删除)
- 先进后出特性
1.1堆栈的抽象数据类型描述
类型名称: 堆栈(Stack)
数据对象集:一个有0个或多个元素的有穷线性表。
操作集:长度为MaxSize的堆栈S Stack,堆栈元素item ElementType
1、Stack CreateStack( int MaxSize )
: 生成空堆栈,其最大长度为MaxSize;
2、int IsFull( Stack S, int MaxSize )
:判断堆栈S是否已满;
3、void Push( Stack S, ElementType item )
:将元素item压入堆栈;
4、int IsEmpty ( Stack S )
:判断堆栈S是否为空;
5、ElementType Pop( Stack S )
:删除并返回栈顶元素;
Push 和 Pop 可以穿插交替进行;
按照操作系列
(1)Push(S,A), Push(S,B),Push((S,C),Pop(S),Pop(S),Pop(S)
堆栈输出是?
CBA
(2) 而Push(S,A), Pop(S),Push(S,B),Push((S,C),Pop(S),Pop(S)
堆栈输出是?
ACB
栈分为顺序栈和链式栈。
1.2顺序栈
栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成。
1.顺序栈定义
#define MaxSize <储存数据元素的最大个数>
typedef struct SNode *Stack;
struct SNode {
ElementType Data[MaxSize];
int Top;
};
2.入栈
void Push( Stack PtrS, ElementType item ) {
if ( PtrS->Top == MaxSize-1 ) {
printf("堆栈满");
return;
} else {
PtrS->Data[++(PtrS->Top)] = item;
return;
}
}
3.出栈
ElementType Pop( Stack PtrS ) {
if ( PtrS->Top == -1 ) {
printf("堆栈空");
return ERROR; /* ERROR是ElementType的特殊值,标志错误 */
} else
return ( PtrS->Data[(PtrS->Top)--] );
}
1.3链式栈
栈的链式存储结构实际上就是一个单链表,叫做链栈。插入和删除操作只能在链栈的栈顶进行。
1.链式栈定义
typedef struct SNode *Stack;
struct SNode {
ElementType Data;
struct SNode *Next;
} ;
2.堆栈初始化(建立空栈)
Stack CreateStack() {
/* 构建一个堆栈的头结点,返回指针 */
Stack S;
S =(Stack)malloc(sizeof(struct SNode));
S->Next = NULL;
return S;
}
3.判断堆栈是否为空
int IsEmpty(Stack S)
{
/*判断堆栈S是否为空,若为空函数返回整数1,否则返回0 */
return ( S->Next == NULL );
}
这里的S并不是头节点,而是指向头节点
4.入栈
void Push( ElementType item, Stack S) {
/* 将元素item压入堆栈S */
struct SNode *TmpCell;
TmpCell=(struct SNode *)malloc(sizeof(struct SNode));
TmpCell->Element = item;
TmpCell->Next = S->Next;
S->Next = TmpCell;
}
5.出栈
ElementType Pop(Stack S) {
/* 删除并返回堆栈S的栈顶元素 */
struct SNode *FirstCell;
ElementType TopElem;
if( IsEmpty( S ) ) {
printf(“堆栈空”);
return NULL;
} else {
FirstCell = S->Next;
S->Next = FirstCell->Next;
TopElem = FirstCell ->Element;
free(FirstCell);
return TopElem;
}
}
2.队列
队列(Queue):具有一定操作约束的线性表
- 插入和删除操作:只能在一端插入,而在另一端删除。
- FIFO:先进先出
2.1队列的抽象数据类型描述
类型名称:队列(Queue)
数据对象集:一个有0个或多个元素的有穷线性表。
操作集:长度为MaxSize的队列Q Queue,队列元素item ElementType
1、Queue CreatQueue( int MaxSize )
:生成长度为MaxSize的空队列;
2、int IsFullQ( Queue Q, int MaxSize )
:判断队列Q是否已满;
3、void AddQ( Queue Q, ElementType item )
: 将数据元素item插入队列Q中;
4、int IsEmptyQ( Queue Q )
: 判断队列Q是否为空;
5、ElementType DeleteQ( Queue Q )
:将队头数据元素从队列中删除并返回。
2.2顺序队列
队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front以及一个记录队列尾元素位置的变量rear组成。
1.顺序队列结构体定义
#define MaxSize <储存数据元素的最大个数>
struct QNode {
ElementType Data[ MaxSize ];
int rear;
int front;
};
typedef struct QNode *Queue;
顺序队列的一个劣势就是,随着数据的入队列和出队列,front和rear指针会一直向右移动,最终可能无法再添加新的元素,但是这个时候数组其实还有很多的空间,为了让队列继续可用,就需要数据搬移。
而为了避免数据搬移,就会把顺序存储结构的队列设计成循环队列。
循环队列的本质就是在入队列的时候,rear指针会回到数组的前面去。
你也可以把它的逻辑图画成这样
队列空:
front==rear
队列满:
(rear+1)%maxsize == front
2.入队列
void AddQ( Queue PtrQ, ElementType item) {
if ( (PtrQ->rear+1) % MaxSize == PtrQ->front ) {
printf("队列满");
return;
}
PtrQ->Data[PtrQ->rear] = item;
PtrQ->rear = (PtrQ->rear+1)% MaxSize;
}
3.出队列
ElementType DeleteQ ( Queue PtrQ ) {
if ( PtrQ->front == PtrQ->rear ) {
printf("队列空");
return ERROR;
} else {
ElementType x = PtrQ->Data[PtrQ->front];
PtrQ->front = (PtrQ->front+1)% MaxSize;
return x;
}
}
2.3链式队列
队列的链式存储结构也可以用一个单链表实现。插入和删除操作分别在链表的两头进行。
1.链式队列结构体定义
struct Node {
ElementType Data;
struct Node *Next;
};
struct QNode { /* 链队列结构 */
struct Node *rear; /* 指向队尾结点 */
struct Node *front; /* 指向队头结点 */
};
typedef struct QNode *Queue;
Queue PtrQ;
2.出队列
ElementType DeleteQ ( Queue PtrQ ) {
struct Node *FrontCell;
ElementType FrontElem;
if ( PtrQ->front == NULL) {
printf("队列空");
return ERROR;
}
FrontCell = PtrQ->front;
if ( PtrQ->front == PtrQ->rear) /* 若队列只有一个元素 */
PtrQ->front = PtrQ->rear = NULL; /* 删除后队列置为空 */
else
PtrQ->front = PtrQ->front->Next;
FrontElem = FrontCell->Data;
free( FrontCell ); /* 释放被删除结点空间 */
return FrontElem;
}
3.入队列
void AddQ( Queue Q, ElementType x)
{
Node *newnode =(Node*)malloc(sizeof(Node));
newnode->Data = x;
newnode->Next = NULL;
if ( PtrQ->front == NULL) {
//空队列
Q->front = Q ->rear = newnode;
} else{
Q->rear->Next = newnode;
Q->rear = newnode;
}
}
【algo&ds】3.栈和队列的更多相关文章
- DS博客作业03——栈和队列
1.本周学习总结 谈谈你对栈和队列结构的认识及学习体会. 栈和队列的本质就是线性表.所以,相应的栈跟队列都有两种存储结构:顺序存储结构.链式存储结构. 栈的特点是后进先出,根据栈时进时出的规则,出栈的 ...
- DS博客作业03—栈和队列
1.本周学习总结 本周学习了栈和队列两种数据结构,分别对应后进先出,先进先出两种数据操作 学会栈的特殊类型-共享栈,队列的特殊类型-循环队列的一系列操作 学会熟练使用栈和队列的STL容器,使代码简洁 ...
- 学习javascript数据结构(一)——栈和队列
前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...
- [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)
再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...
- 剑指Offer面试题:6.用两个栈实现队列
一.题目:用两个栈实现队列 题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 原文是使用 ...
- C实现栈和队列
这两天再学习了数据结构的栈和队列,思想很简单,可能是学习PHP那会没有直接使用栈和队列,写的太少,所以用具体代码实现的时候出现了各种错误,感觉还是C语言功底不行.栈和队列不论在面试中还是笔试中都很重要 ...
- JavaScript数组模拟栈和队列
*栈和队列:js中没有真正的栈和队列的类型 一切都是用数组对象模拟的 栈:只能从一端进出的数组,另一端封闭 FILO 何时使用:今后只要仅希望数组只能从一端进 ...
- 用JS描述的数据结构及算法表示——栈和队列(基础版)
前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里 ...
- JavaScript中的算法之美——栈、队列、表
序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...
- Java数据结构和算法之栈与队列
二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为 ...
随机推荐
- Centos 7.2天兔(Lepus 3.8)数据库监控系统部署
天兔(Lepus 3.8)数据库监控系统部署 转载自:https://blog.csdn.net/m0_38039437/article/details/79613260 一.安装LAMP基础环境 首 ...
- Java 8 Optional:优雅地避免 NPE
本篇文章将详细介绍 Optional 类,以及如何用它消除代码中的 null 检查.在开始之前首先来看下什么是 NPE,以及在 Java 8 之前是如何处理 NPE 问题的. 空指针异常(NullPo ...
- windows服务隐藏后门之克隆帐号
windows服务隐藏后门之克隆帐号 1.CMD命令行下,建立了一个用户名为“test$”,密码为“abc123!”的简单隐藏账户,并且把该隐藏账户提升为了管理员权限. PS:CMD命令行使用&quo ...
- PMP(第六版)中的控制账户、规划包、工作包
PMP(第六版)中的控制账户.规划包.工作包 控制账户是一个管理控制点,在该控制点上,把范围.预算和进度加以整合,并与挣值比较,以测量绩效.控制账户拥有2个或以上的工作包,但每个工作包只与一个控制账户 ...
- [BZOJ1833][ZJOI2010]数字计数
Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output 输出文 ...
- c++11::std::decltype/declval
decltype ( 实体 ) () (C++ 起) decltype ( 表达式 ) () (C++ 起) 若实参是其他类型为 T 的任何表达式,且 a) 若 表达式 的值类别为亡值,则 declt ...
- django报错问题解决
注意以下修改文件均是修改虚拟python环境中的文件 1.执行(venv) E:\myproj\autotest>python manage.py makemigrations报错: 解决办法: ...
- tomcat+Apache介绍
tomcat不是一个完整意义上的Jave EE服务器,它甚至都没有提供对哪怕是一个主要Java EE API的实现:但由于遵守apache开源协议,tomcat却又为众多的java应用程序服务器嵌入自 ...
- Apache Pig中文教程集合
Apache Pig中文教程集合: http://www.codelast.com/?p=4550#more-4550
- 玩转OneNET物联网平台之MQTT服务③ —— 远程控制LED(设备自注册)
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...