栈的基本操作
栈的存储方式
由于栈本身就是线性表,于是栈也有顺序栈和链栈两种实现方式
栈的顺序存储——顺序栈
栈的链式存储——链栈
栈的顺序表示
存储方式:同一般的线性表的顺序存储结构完全相同,利用(数组)一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,栈底一般在低地址端
- 附设top指针,指示栈顶元素在顺序栈的位置
- 另设base指针,指示栈底元素在顺序栈的位置
但是为了方便操作通常top指针指向栈顶元素之上的下标地址指向线性表中的an+1
另外用stacksize表示栈可使用的最大容量(栈最多可以存放的元素个数)C语言中下标不能越界否则就有语法错误
栈满了如果再插入元素就溢出了(上溢)
栈满如果还想插入元素的处理方法:
将原栈内容移入新栈比较费时尤其是数据量大的时候[不到万不得已不会这样操作]
栈里没有元素仍要出栈(下溢)
- 使用数组作为顺序栈的存储方式的特点:
简单、方便、易产生溢出(数组大小固定)
-
上溢(overflow):栈已满又要压入元素
-
下溢(underflow):栈已空,还要弹出元素
注:上溢是一种错误,使问题是处理无法进行,而下溢一般认为是一种结束条件,即问题处理结束
顺序栈的表示
- 线性表动态分配【对比】
这是栈是限定了插入和删除的位置附设top
top和base可以定义为整型存储数组的下标/定义为指针(指针相减的前提是两指针指向同一数组)
顺序栈的初始化(开辟指定大小的空栈)[maxsize太大可能分配不成功报错加上这样一个判断就可以了]
【算法补充】:判断顺序栈是否为空
【算法补充】:求顺序栈的长度
顺序栈的入栈
前++先用后加
【算法3.3】顺序栈的出栈
前++先用后加
【算法3.3】顺序栈的出栈