首页
学习
活动
专区
圈层
工具
发布

C语言栈和队列的实现

第一个结构体仅负责存储队列中的单个数据元素,以及通过next指针和其他节点建立链接,是链式队列的最小数据单元,就像排队时的 “每个人”,只承载自己的信息,并知道自己后面是谁 第二个结构体不存储具体数据,...pnext; free(newphead); newphead = cur; } ps->phead = ps->ptail = NULL; ps->size = 0; } 这里的销毁其实和单链表的销毁差不多...,将元素 x 插入队列尾部(队列遵循 “先进先出”); 核心逻辑: 校验队列指针有效性,避免空指针操作; 申请新链表节点并初始化(存值 x、后继置空),内存申请失败则报错退出; 空队列:头尾指针均指向新节点...,移除队列头部元素(队列遵循 “先进先出”),释放节点内存并更新指针 / 元素个数; 核心逻辑: 校验队列指针有效性,避免空指针操作; 分两种场景处理: 队列仅 1 个节点:释放该节点,头尾指针均置空(...判断是否为空 bool QueueEmpty(Queue* ps); bool QueueEmpty(Queue* ps) { assert(ps); return ps->size == 0; } 取对头和对尾

11910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++栈和队列

    使用标准库的栈和队列时,先包含相关的头文件 #include #include 定义栈如下: stack stk; 定义队列如下: queue q; 栈提供了如下的操作...() { conversion(10,2); } ②表达式求值 表达式求值是程序设计语言编译中的一个最基本的问题。...(除了#符外,只有‘(’和‘)’是相等的),则将‘(’出栈;执行(2) (3)直到整个表达式求值完毕(即OPTR栈顶元素和当前读入的字符均为‘#’) 具体算法实现: #include c1和栈外运算符c2的优先级 */ char precede(char c1, char c2) { int i1 = get(c1); int i2 = get(c2);...return 0; } 队列的应用 舞伴问题 1、问题叙述 假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。

    82131

    LeetCode刷题(7)【栈&队列】用队列实现栈(C语言)

    用队列实现栈 225....用队列实现栈 - 力扣(LeetCode) (leetcode-cn.com) 目的:用队列实现栈,从先进先出——>先进后出, 1234这四个数据依次从队列1的队尾进入,要让4先出,一个队列是无法实现的...将123依次由队列2的队尾进入到队列2中,此时队列1中还剩一个4,将4弹出,同理,再将12依次进入到队列1中,将3弹出… 也就是说。 出数据把不为空的 队列数据向为空的队列中导,知道剩最后一个。...QueuePush(emptyQ,QueueFront(noemptyQ)); //出一个删一个 QueuePop(noemptyQ); } //接口要求——返回栈顶的元素...QueuePop(noemptyQ); return top; } /** Get the top element. */ int myStackTop(MyStack* obj) { //取栈的最上面的元素

    65110

    用队列实现栈(C语言版本)

    个人主页: :✨✨✨初阶牛✨✨✨ 强烈推荐优质专栏: C++的世界(持续更新中) 推荐专栏1: C语言初阶 推荐专栏2: C语言进阶 个人信条: 知行合一 前言 在做这个题目之前,应当熟悉栈和队列这两种数据结构....栈和队列都是常见的数据结构,它们是基于数组或链表实现的线性数据结构。...栈(Stack): 栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构,只允许在栈顶进行插入和删除操作。...栈的基本操作包括入栈(push)、出栈(pop)、查看栈顶元素(top)和判断栈是否为空(empty)。 应用场景:实现程序调用的函数堆栈、表达式求值、括号匹配检验等。...一、题目介绍 题目来源于–力扣 题目链接:传送门 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

    49930

    栈和队列的C++实现

    线性表中,先进先出的叫队列,先进后出的叫栈。队列常用于BFS,而在函数递归层数过高时,需要手动实现递归过程,这时候便需要写一个“手动栈”。        ...有时候,我们会有大量数据频繁出入队列,但同时存在其内的元素却不多,此时需要写“循环队列”。其代码并不难,但里面下标递增的语句值得斟酌一下。...下面给出代码: // 假设储存的信息类型是int // 栈 class Stack { static const int maxn = 10000; int S[maxn],L; public...void in(int x) { Q[j++]=x; } int out() { return Q[i++]; } int size() { return j-i; } }; // 循环队列...(j-i):(j+maxn-i); } // 此处提醒,循环队列元素个数应在0~maxn-1之间,不可达到maxn38 };

    80820

    【数据结构】栈和队列(c语言实现)(附源码)

    由于数据的插入和删除在同一端,所以栈的数据元素遵从“先进后出”的原则。 2.栈的实现 一般可以使用顺序表或者链表实现栈,在进行插入删除操作时满足先进后出原则即可。...STEmpty(ps)); return ps->arr[ps->top - 1];//栈顶top-1的位置即为栈顶元素 } 二、队列 学习了栈的特性和方法实现之后,我们再来了解一个新的数据结构...2.队列的实现 与栈相同,队列的实现也可以用顺序表或链表。由于顺序表两端的插入和删除操作要涉及到数据的全体移动,效率较低,我们就尝试用链表来实现队列。...); cur = next;//cur指针指向记录的节点 } pq->phead = pq->ptail = NULL; pq->size = 0; } 总结 今天我们学习了栈和队列这两种数据结构...栈和队列在一些场景的实用性很高,例如二叉树的层序遍历、快速排序的非递归实现等。如果你觉得博主讲的还不错,就请留下一个小小的赞在走哦,感谢大家的支持❤❤❤

    44610

    用队列和栈分别实现栈和队列

    用队列实现栈 题目解读 本题的要求是要用两个队列来实现一个先进后出的栈,并且要有以下功能: 1.将元素压入栈中 2.移除栈顶元素并且返回他 3.返回栈顶元素 4.判断栈是否为空 题目构思和代码实现...我们首先要做的就是将实现队列的代码导入该题(也可以自己写) 下面我们来进行题目的构思: 我们知道,栈的增加和删除元素都是从栈顶进行操作的,并且遵循先进后后出的原则,但是队列是遵循先进先出的规则,增加元素从队尾增加...其实题目已经给了我们提示:用两个队列! 我们可以这样,先构造两个队列,一个用来删除栈的元素,一个用来增加栈的元素。...题目解读 题目的意思和上一题大同小异,要实现的功能都大差不差的,这里我就不做过多的解读,直接开始构思: 题目构思和代码实现 要想实现队列,我们用两个栈如何实现呢?...首先,栈时遵循先进后出的原则,但是队列时先进先出,难不成也像上一题一样,一个栈用来增加数据,另一个栈用来删除数据?

    26210

    栈和队列---循环队列

    1.循环队列的出现 (1)上面的这个就是一个普通的数据的入队和出队的过程我们正常情况下去实现这个入队和出队的过程,就是这个数据从这个队尾进入,从队头离开,但是这个加入的时候肯定是没有其他的问题的,直接在这个队尾插入数据就可以了...1之后和这个队列里面的元素的个数取模,等于0,这个时候就相当于这个最后一个下标之后就是第一个下标,以此来实现这个循环队列; (3)队列是空的临界条件: 我们假设这个时候的队列里面只有一个数据,指针的指向情况如图所示...指针,数据出队,我们需要移动这个front指针,两个最后的效果是一样的,但是中间经历的过程不是一样的; (5) (6)循环队列实现入队和出队 我们之前的这个思路完全不变,只不过这个循环之后,原来这个入队就是把这个...3)具体举例说明 这个事件链表和这个队列数组之间有什么关系?...,两者之间的数据是相互辅助的; 由于这个算法的综合性比较强,因此学有余力的同学可以自行学习,刚开始学习栈和队列的同学不建议上手,因为这个里面涉及到链表,和这个队列数组,综合性较强,需要把这些铺垫知识学好再去学习

    52000

    数据结构(C语言篇):(十)栈和队列OJ题详解

    前言 本期博客博主将为大家带来一些经典的栈和队列OJ题详解,希望能加深大家对栈和队列的理解。下面就让我们正式开始吧! 一、有效的括号 题目链接:20....用栈实现队列 - 力扣(LeetCode) 解题思路分析: 入队列:往pushST中插入数据; 出队列:popST不为空直接出,否则将pushST中的数据先倒过去再出数据; 取队头:逻辑和出队列一样,...预留一个空位:区分队列空和满的状态 模运算实现循环:通过 %(capacity+1) 实现指针循环 front指向队头元素,rear指向队尾元素的下一个位置 实现逻辑如下:...空队列:front == rear 满队列:(rear+1) % (capacity+1) == front 3.判断队列是否为空:front和rear指向同一位置时队列为空。...希望这些OJ题能够加深大家对栈和队列相关知识的理解,谢谢大家的支持!

    9310

    栈 和 队列

    1.栈 1.1栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。...栈中的数据元素遵守后进先出 LIFO ( Last In First Out )的原则。 压栈:栈的插入操作叫做进栈 / 压栈 / 入栈, 入数据在栈顶 。 出栈:栈的删除操作叫做出栈。...队列 2.1队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾...出队列:进行删除操作的一端称为队头 2.2队列的实现 队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。...销毁队列 void QueueDestroy(Queue* q); 另外扩展了解一下,实际中我们有时还会使用一种队列叫循环队列。

    25810

    —栈和队列

    1.栈 1.栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。...2.队列的实现 队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。...然后,将队列的头指针phead和尾指针ptail都置为空,即队列初始时是空的。队列的大小size也被初始化为0,表示队列中没有元素。...最后将队列的头部指针 pq->phead 和尾部指针 pq->ptail 都指向 NULL,队列大小 pq->size 置为 0。...如果队列为空,则将队列的头指针和尾指针都指向新节点。 5. 如果队列非空,则将尾节点的next指针指向新节点,然后将尾节点指针指向新节点。 6. 更新队列的元素数量。 7. 函数结束。

    32410

    队列和栈

    一、定义和概念 顺序队列 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。...因此,队列判空的条件是 front=rear,而队列判满的条件是 front = (rear+1)%MaxSize (1)a,b,c,d,e 入队 (2)a,b 出队,对头指针指向 c (3)假设队列...栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。...// a,b,c,d入栈【正常,元素a,b,c,d,top=3】 // e入栈【异常,栈满】 // d,c,b,a出栈【正常,出栈顺序d,c,b,a,top=-1】 /...,通过重新入队可以解决已经被处理过并且处理异常的数据可以轮到后续的定时任务中处理 总结 队列和栈的定义和概念都比较简单,但队列和栈的思想都经过包装了各种介质被广泛应用。

    50110

    栈和队列

    限定仅在表尾进行插入和删除操作的线性表 特点 后进先出(LIFO即Last in First out),把栈比喻薯片桶,一开始薯片桶的空的,第一片放进去的薯片会在最底部,第二片薯片会在顶部,想要吃掉第一片薯片...} 案例 十进制转二进制 采用余数法,和2取余,把得到的结果进行逆序就是转换结果。...,第三个人喊3并淘汰, // 继续把花传给下一个人,继续数,继续淘汰,最后一个人是赢家 // 要求,给定一个数和一群人,返回赢家 function game(num, list) { var queue...taotai) y++ } return queue.dequeue() } //赢家是: a console.log('赢家是:', game(3, ['a', 'b', 'c'..., 'd', 'e', 'f'])) 优先级队列 普通的队列是一种先进先出(First in First Out)的数据结构,元素在队列尾追加,而从队列头删除。

    50240

    栈和队列

    # 栈和队列 队列和栈都是操作受限的线性表:前者先进先出,后者先进后出。 # 栈 # 栈是什么 在 LIFO (后进先出) 数据结构中,将首先处理添加到队列中的最新元素。...栈是一个 LIFO (后进先出) 数据结构。栈是一种 “操作受限” 的线性表,只允许在一端插入和删除数据。通常,插入操作在栈中被称作入栈 push 。与队列类似,总是在堆栈的末尾添加一个新元素。...从栈的定义可以看出,栈只支持两个基本操作:入栈 push() 和 出栈 pop() ,也就是在栈顶插入一个数据和从栈顶删除一个数据。...# 为什么需要队列 为什么需要队列和为什么需要栈,是同样的道理,参考 为什么需要栈 # 队列的应用场景 (1)阻塞队列 阻塞队列其实就是在队列基础上增加了阻塞操作。...# 参考资料 数据结构与算法之美 Leetcode:栈和队列 数据结构 线性表 栈 队列

    52710
    领券