一.栈的认识
栈是一种不同于链表和顺序表的储存数据结构,它对存储数据和取出数据有着特殊的要求🤔。
首先栈只能从一端存储数据,也就是从一端进,还从这一端出这也是栈最大的特点,这也导致在栈中存取数据都必须遵循先进后出的原则😊,即先存入的数据只能最后拿出来,嗯🤔你可以把它想做一个细长的圆桶,你要往里放东西肯定是先放在最下面,当放满这个圆桶后你要再拿出刚开始放的那个,就必须把它上面的东西都拿出来才行。下面我来画图演示一下(画的不好请见谅🦊):
一般我们将栈用来存取的一端叫做栈顶,我们常常说取栈顶元素就是去取离栈顶最近的元素(也就是图中的3),另一端叫做栈底,向栈中存储数据叫做压栈,取出数据叫做出栈。
🐱以上就是关于栈的基本概念,接下来我们来自己实现一个栈,并进行增删查改😊。
二.栈的手动实现
因为栈不像顺序表和链表,可以随便访问到任意一个位置的数据,栈只能对栈顶元素进行操作并且遵循先进后出原则。那具体怎么操作呢🧐,接着看😉。
1.创建栈🐱
栈可以用数组来实现也可以用链表来实现
数组栈:用数组实现比较方便,而且再尾部插入和删除的代价小时间复杂度为O(1),且没有其他额外开销。这种实现方式适合于栈的常见操作,如进栈和出栈,因为这些操作在数组的尾部进行,效率较高。然而,数组的缺点是大小固定,需要预先分配足够的空间,且在栈满时无法动态扩展。
链表栈:可以灵活地添加或删除元素,无需预先分配固定大小的存储空间。链表栈通过维护一个指向栈顶元素的引用(头插,头删),可以实现快速的进栈和出栈操作。然而,链表在实现栈时,每个元素都需要额外的空间来存储指向下一个元素的引用,这可能导致空间上的开销。
具体使用哪种更据具体需要😊
博主这里使用数组来实现栈😊
2.判断是否压满🐱
方法和顺序表一样直接判断数组长度和栈内元素数量是否相同
3.压栈🐱
压栈的操作其实很容易实现首先还是和顺序表一样先判断是否扩容,然后直接在最后插入一个数据即可😉
4.出栈🐱
博主这里设定如果栈为空就抛出一个错误
出栈操作依然简单😸,让数据容量减一,然后返回栈顶元素就行😼
5.获取栈顶元素🐱
到这里你应该已经可以自己完成这个操作了吧😸,试着自己操作一下吧,实现方法和出栈类似。
6.获取长度和判空🐱
7.打印栈的元素🐱
到这里我们栈的内容就聊完了😋,如果你有什么不懂得地方或者其他见解,欢迎在下方评论或者私信博主,最后也希望可以多多支持一下博主🥰🥰!!!下一篇我们来聊一聊队列😸🙉