数据结构PT2——堆栈/队列

ops/2024/10/21 6:23:38/

一、堆栈(FILO)

堆栈是一种线性结构,也是一种特殊的线性表

1:堆栈的顺序存储实现

    栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成

#define MaxSize
typeof struct SNode *Stack
struct SNode{ElementType Data[MaxSize]int Top;
};

①入栈

void Push(Stack PtrS,ElementType item)
{if(PtrS -> Top == MaxSize - 1){printf("堆栈满");return}else{PtrS -> Data[++(PtrS -> Top)] = item;    //item到栈顶,先用再+return;}
}

②出栈

void Pop(Stack PtrS)
{if(PtrS -> Top == - 1){printf("堆栈空");return ERROR;}else{return (PtrS -> Data[(PtrS -> Top)- -]);    //先减再用}
}

2:堆栈的链式存储实现

栈的链式存储结构实际上是一个单链表,叫链栈

typedef struct SNode *Stack;
struct SNode{ElementType Data;struct SNode *Next;
};

①堆栈初始化/是否为空

实际上是创建一个 堆栈的头节点,返回指针

Stack CreateStack(){Stack S;S = (Stack) malloc (sizeof(struct SNode));S -> Next = NULL;return S;
}

int IsEmpty(Stack S)
{return(S -> Next == NULL);
}

②入栈

void Push(ElementType item, Stack S)    //S是指向栈的指针,单纯是一个指针,并没有元素
{struct SNode *TmpCell;TmpCell = (struct SNode*) malloc(sizeof(struct SNode));    //创建新节点TmpCell -> Element = item;TmpCell -> Next =  S -> Next;    //S就如上定义,是一直指向栈顶的,S的Next是一直指向栈顶元素,这时候就是把有元素的Next指针指向了原栈顶元素S -> Next = TmpCell;    //然后栈顶指针S继续指向栈顶
}

③出栈

ElementType Pop(Stack S)
{struct SNode *FirstCell;    //指向该结构的指针ElementType TopElem;    //存储栈顶的值if(IsEmpty(S)){printf("堆栈空");return NULL;}else{FirstCell = S -> Next;    //拿一个临时指针来指向栈顶元素S -> Next = FirstCell -> Next;    //把S指向该栈顶的下一个元素TopElem = FirstCell -> Element;    //元素赋值给该Element变量free(FirstCell);    //释放临时指针return TopElem;}
}

二、队列(FIFO)

队列是一种手操作约束的线性表

1:队列的顺序存储实现

队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front和一个记录队列尾位置的变量rear组成(加入元素,rear+1,删除元素,front+1)

#define MaxSize
struct QNode{ElementType Data[MaxSize];int rear;int front;
};
typedef struct QNode *Queue;

①入队列

void AddQ(Queue PtrQ,ElementAType item)
{if(PtrQ -> rear + 1) % MaxSize == PtrQ -> front){print("队列满");return;PtrQ -> rear = (PtrQ -> rear + 1)%MaxSize;PtrQ -> Data[PtrQ -> rear] = item;
}

②出队列

ElementType DeleteQ(Queue PtrQ)
{if(PtrQ -> front = = PtrQ -> rear){print("队列空");return ERROR;}else{PtrQ -> front = (PtrQ -> front + 1)%MaxSize;return PtrQ -> Data[PtrQ -> front];}
}

2:队列的链式存储实现

struct Node{ElementType Data;struct Node *Next;
};
struct QNode{struct Node *rear;    //指向队尾struct Node *front;    //指向队头
};
typedef struct QNode *Queue;
Queue PtrQ;

①入队

 

②出队

ElementType DeleteQ(Queue PtrQ)
{struct Node *FrontCell;ElementType FrontElem;if(PtrQ -> front = = NULL){printf("队列空");return ERROR;}if(PtrQ -> front = = PtrQ -> rear);PtrQ -> front = PtrQ -> rear = NULL;elsePtrQ -> front = PtrQ -> front -> Next;FrontElem = FrontCell -> Data;free(FrontCell);return FrontElem;
}

http://www.ppmy.cn/ops/15904.html

相关文章

【毕设绝技】基于 SpringCloud 的在线交易平台商城的设计与实现(一)

毕业设计是每个大学生的困扰,让毕设绝技带你走出低谷迎来希望! 基于 SpringCloud 的在线交易平台商城的设计与实现 一、摘 要 随着互联网的快速发展,人们对商品经济的消费和思考不再停留在传统的经济模式上,网上购物商城是企业与…

面试二十二、跳表SkipLists

跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表,且每一层链表中的元素是前一层链表元素的子集(见右边的示意图&…

100-Python Django 在线电子商城

基于Django的在线电子商城开发实践 一、引言 随着互联网的快速发展,电子商务已经成为人们日常生活中不可或缺的一部分。在线电子商城作为电子商务的重要组成部分,为用户提供了便捷的购物体验。本文将以Python的Django框架为基础,介绍如何开…

Docker 网络与资源控制

一 Docker 网络实现原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根 据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默 认网关。因为在同…

html渲染优先级

HTML渲染优先级主要涉及到浏览器如何解析和渲染HTML文档的过程。虽然具体的渲染顺序和优先级可能因浏览器的不同而有所差异,但大体上,HTML的渲染遵循以下基本步骤和原则: 解析HTML文档:浏览器首先会获取HTML文档,然后…

「笔试刷题」:dd爱框框

一、题目 题目描述 读入n,xn,xn,x,给出nnn个数a[1],a[2],……,a[n]a[1],a[2],……,a[n]a[1],a[2],……,a[n],求最小的区间[l,r][l,r][l,r],使a[l]a[l1]……a[r]≥xa[l]a[l1]……a[r]≥xa[l]a[l1]……a[r]≥x,若存在相…

Elasticsearch:崭新的打分机制 - Learning To Rank (LTR)

警告:“学习排名 (Learning To Rank)” 功能处于技术预览版,可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题,但此功能不受官方 GA 功能的支持 SLA 的约束。 注意:此功能是在版本 8.12.0 中引入的,并且仅适…

T1级,生产环境事故—Shell脚本一键备份K8s的YAML文件

大家好,我叫秋意零。 最近对公司进行日常运维工作时,出现了一个 T1 级别事故。导致公司的“酒云网”APP的无法使用。我和我领导一起搞了一个多小时,业务也停了一个多小时。 起因是:我的部门直系领导,叫我**删除一个 …