目录
前言:
本篇将进入到数据结构中的栈,命名风格及实现偏向stl中的stack,后面与之相对的还有队列,将在下一篇介绍。
1.物理结构
栈和队列的存储结构都很简单,主要看你怎么实现:
再结合官方文档:
栈的结构就浮现出来了:遵循后进先出的理念,入栈或称压栈时放到栈底,计top为栈顶元素,每进一个元素top就++,但是栈实际还是对数组的管理,所以top作为下标,并在开始初始化为0,就代表着如果入栈一个元素,top就是1,但是top是指向栈顶元素的下一个,但这个1就代表着是1个元素,当然如果想让top更符合1就是指向栈顶元素的话,就可以初始化为-1,本篇采用初始化为0的写法。
2.需要实现的功能
1.封装为结构体,top是栈顶元素,capacity为容量。
2.需要实现初始化,插入,删除,取栈顶元素,判空,判断大小,销毁。
3.初始化
1.要对pst解引用,需要断言不能为空。
2.top为0要表示没有元素,那进一个元素top++,而top又是下标,top为1就指向栈顶元素的下一个,也可以让top初始化为-1,区别在下方解释。
4.销毁
释放掉栈,置空ing,容量和栈顶元素下标都置0即可。
5.入栈
1.入栈开始如果开始栈顶元素的下一个的下标与容量相等,就需要扩容,其实就是没有元素的时候,扩为4,如果再来判断相等就是容量不够扩2倍。
2.新扩的空间给pst->q,容量换完新的容量,这里没有用malloc扩容是因为,开始pst->a为空其实也就是malloc了。
3.扩容好后插入元素,由于top开始是0,那正好就是代表放入第一个元素,然后再++top,此时就代表top指向栈顶元素的下一个,但是top是数值也代表容量,后面size的实现就需要top的值,如果初始化为-1,就要先++top此时top为0插入第一个元素,并且top也指向栈顶元素,但是不同的是,其他函数也要跟着变,实现哪一个都行。
6.出栈
虽然top--后还是top还是能访问栈顶的下一个元素,但是由于初始化时top为0就代表没有元素了,所以top--就认为是出栈,为空不能出栈。
7.判空
栈顶没有元素栈底当然有没有,就是空。
8.取栈顶元素
top指向栈顶元素的下一个,-1就是栈顶元素的下标。
9.元素个数
top就代表元素个数,同时也是栈顶元素的下一个的下标。