栈的概念及结构
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端
称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。(后进入的元素最先出栈)结构弹夹
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
如何实现栈?
1数组栈:数组的开头是栈底,因为数组方便尾删(最佳实现),且cpu的高速缓存命中率高,
2链式栈:双向链表,栈顶可以是尾,也可以是头。头插头删,尾插尾删,效果相同。
单链表:栈顶只能是头,因为头插头删更方便。(单链表更好)
两种top的选择
1空时top=-1,top指向栈顶的上一个元素。Top=0时,一个元素。,top指向栈顶
2空时top=0,top指向栈顶元素,top=1时,top指向栈顶元素的下一个位置。
因此,在判断容量相等时,后者top==capacity 而前者是top+1==capacity。
怎么插入取决你怎么初始化。
栈的后进先出是相对的,是相对于在栈元素而言的,可以进的时候同时出,入栈顺序和出栈顺序是一对多的关系。
栈OJ题
1有效的括号
1数量匹配 2顺序匹配
*s取的是字符串的ASCLL码
同一域里不能有同名变量,
内存泄漏不会报错。
栈溢出:指的是操作系统的问题,比如递归程序,返回条件有问题
数据结构:栈 操作系统:栈(内存区域) 二者不一样
队列
2.1队列的概念及结构
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头

队列的实现 队尾入队头出
1数组 挪动覆盖 算法复杂度高
2单向链表
3双向链表 双向比但单向多了个指针,因此选单链表
头删需考虑空结点和但结点的情况,单节点会出现野指针。
有typedef是类型,无是类型,对于结构体右下角的名称而言。
函数内部的局部变量的地址不能返回,因为出了函数作用域就销毁了。返回的就是个野指针。
OJ题目
用队列实现栈
一个队列存储数据,另一个队列来出数据导数据。
用栈实现队列。
设计循环队列
头=尾 为空
Front指向对头,back指向对尾的下一个位置。back类似于之前栈里面的top
怎么判断满?
解决方案:
1 增加一个size, front=back的前提下,size=0为空,size!=0为满。
2多开一个位 k数据个数,空间开了k+1个,解决上面无法区分空和满的问题。
(back+1)%(k+1)=front;
选数组要把取模运算玩好
千万不要写front指向头,back指向尾的下一个(如果不多开一个位置)。
单向循环链表来实现的缺点
1唯独不好取队尾数据
解决方案
1增加一个backprev指针
2改成双向链表
如果front=back 怎么判断空结点还是单结点。
OJ题看不出错误的解决方法
1画图之后走读代码,看有没有逻辑错误。
2放进VS调试,有些语法错误力扣是不报错的!
本文详细解释了栈和队列的基本概念,包括它们的结构特点(如栈的后进先出原则和队列的先进先出),以及不同实现方式(如数组栈和链式栈)。还讨论了如何避免内存泄漏和栈溢出问题,以及相关的编程技巧和OJ题目示例。
1803






