从数据结构的角度来看,栈是插入和删除操作受限制的线性表;
从抽象数据类型的角度来看,栈是一种重要的抽象数据类型。
栈是插入和删除操作都在表尾的线性表,插入一个元素,放在表尾后面,删除一个元素从表尾开始。所以后进来的元素被先删除,即后进先出(last in first out),缩写为LIFO。
栈的逻辑结构:相邻元素具有单一的前驱和后继的线性关系,同时具有“后进先出”这种特性
顺序栈:具有顺序存储结构的栈。通常以数组的始端作为栈底,即下标为0的数组单元作为栈底。
两栈共享空间:在一个数组中同时存储两个栈。一个栈的栈底为下标为0处,另一个栈的栈底为下标为StackSize-1处(数组长度为StackSize)。两个栈应该满足增长顺序相向,同时空间需求正好相反。即一个栈的长度增长,另一个栈的长度缩短。
好处:减少了上溢的概率,提高了空间的利用。
链栈:具有链接存储结构的栈。以单链表的头结点做栈顶元素。因为插入、删除、取栈顶元素等操作都和栈顶元素有关。这样做很方便。因为如果栈顶元素要是尾结点的话,进行删除操作,不光需要栈顶指针还需要指向前一个结点的指针和头指针与头结点,减少空间复杂度,减少操作为复杂性。
结论:
①使用栈的时候,元素个数变化较大,使用链接存储结构,即链栈;
②使用栈的时候,元素个数变化较小,使用顺序存储结构,即顺序栈。
栈的操作:初始化一个空栈、释放栈的所有结点的存储空间、入栈操作、出栈操作、取栈顶元素,判断栈是否为空栈。
将一个数据结构变成抽象数据类型定义,其中抽象数据类型定义包括数据、逻辑结构、操作。当将这个数据结构在计算机里表示出来的时候,变成了存储结构。存储结构是抽象数据类型定义的实现:操作的实现(算法)、数据的实现(存储)