顺序栈,即用顺序表实现栈存储结构。通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 “先进后出” 的原则,本节就 “如何使用顺序表模拟栈以及实现对栈中数据的基本操作(出栈和入栈)” 给大家做详细介绍。
如果你仔细观察顺序表(底层实现是数组)和栈结构就会发现,它们存储数据的方式高度相似,只不过栈对数据的存取过程有特殊的限制,而顺序表没有。
通过图 1 和图 2 的对比不难看出,使用顺序表模拟栈结构很简单,只需要将数据从 a 数组下标为 0 的位置依次存储即可。
从数组下标为 0 的模拟栈存储数据是常用的方法,从其他数组下标处存储数据也完全可以,这里只是为了方便初学者理解。
了解了顺序表模拟栈存储数据后,接下来看如何模拟栈中元素出栈的操作。由于栈对存储元素出栈的次序有"先进后出"的要求,如果想将图 1 中存储的元素 1 从栈中取出,需先将元素 4、元素 3 和元素 2 依次从栈中取出。
这里给出使用顺序表模拟栈存储结构常用的实现思路,即在顺序表中设定一个实时指向栈顶元素的变量(一般命名为 top),top 初始值为 -1,表示栈中没有存储任何数据元素,及栈是"空栈"。一旦有数据元素进栈,则 top 就做 +1 操作;反之,如果数据元素出栈,top 就做 -1 操作。
因此,python语言实现代码为:
stack = list() top = -1 def push(val): stack.append(val) top += 1 return stack[top]
其实,top变量的设置对模拟数据的入栈操作没有实际的帮助,他是为实现数据的出栈操作做准备的。
元素4和元素3全部出栈后,元素2才能出栈。代码实现为:
def pop(): if top == -1: # 如果top=-1 直接return -1 return -1 result = stack.pop() # 出栈 top -= 1 # top -= 1 return result # 返回出栈的元素
通过学习顺序表模拟栈中数据入栈和出栈的操作,初学者完成了对顺序栈的学习,这里给出顺序栈对数据基本操作的python代码:
class Stack: def __init__(self): self.stack = list() self.top = -1 def push(self, val): self.stack.append(val) self.top += 1 return self.stack[self.top] def pop(self): if self.stack == -1: return -1 result = self.stack.pop() self.top -= 1 return result