栈(Stack)是一种后进先出(LIFO,Last In First Out)的数据结构。根据存储方式的不同,栈可以分为顺序栈、链栈和共享栈。下面介绍这三种栈的上溢和下溢问题。
1. 顺序栈(Array-based Stack)
顺序栈是用数组实现的栈结构。它的栈顶指针通常用一个变量来表示。
上溢问题
顺序栈的上溢(Overflow)问题是指栈满后再进行入栈操作时会发生的情况。由于顺序栈的大小是固定的,当栈顶指针超过数组的最大下标时就会发生上溢。这通常通过检查栈顶指针的值来避免
下溢问题
顺序栈的下溢(Underflow)问题是指栈空时进行出栈操作会发生的情况。当栈顶指针的值小于0时,表示栈为空,再进行出栈操作就会发生下溢。这通常通过检查栈顶指针的值来避免
2. 链栈(Linked Stack)
链栈是用链表实现的栈结构。栈顶指针通常指向链表的头节点。
上溢问题
链栈的上溢问题一般不会发生,因为链栈是动态分配内存的,只要系统有足够的内存,链栈就不会满。
下溢问题
链栈的下溢问题与顺序栈类似,当链栈为空时再进行出栈操作会发生下溢。这通常通过检查栈顶指针是否为 null 来避免
3. 共享栈(Shared Stack)
共享栈是指两个栈共享一个数组的情况。通常一个栈从数组的一端向中间增长,另一个栈从数组的另一端向中间增长。
上溢问题
共享栈的上溢问题是指两个栈在中间相遇时发生的情况。当两个栈的栈顶指针相遇或超过时,就会发生上溢。这可以通过检查两个栈顶指针的值来避免
下溢问题
共享栈的下溢问题与顺序栈类似,每个栈在自己的范围内进行操作,当一个栈为空时再进行出栈操作会发生下溢。这通常通过检查各自栈顶指针的值来避免
如何理解共享栈能降低上溢的可能性、
-
动态利用空间:
- 在单独的顺序栈中,每个栈都有固定的空间限制,当一个栈满了而另一个栈还有剩余空间时,满的那个栈就会发生上溢。
- 而在共享栈中,当一个栈需要更多空间时,可以利用另一个栈未使用的空间,直到两个栈顶指针相遇。这种动态利用空间的方法有效地降低了一个栈单独发生上溢的可能性。
-
平衡负载:
- 在实际应用中,不同栈的使用频率和存储的数据量可能会有较大差异。共享栈允许两个栈之间的空间使用更为灵活和平衡,当一个栈较少使用时,另一个栈可以占用更多的空间。
-
内存利用率更高:
- 共享栈的设计提高了内存利用率,避免了内存浪费。当一个栈在使用更多空间时,另一个栈可以减少占用,从而整体上更好地利用了数组的空间。
-
用人话讲:
- 就是本来只能用一大块内存的栈,现在可以最多用两块了。王道这一块讲的一点都不清晰,服了。