栈是一种操作受限的线性表,限定它只能在表的同一端进行插入和删除操作.允许插入和删除元素的一端称为栈顶,不允许插入和删除元素的一端称为栈底.
由于最先插入的元素总是最后被删除,最后插入的元素总是最先被删除,因此栈也被称为"先进先出"或"后见后出"的线性表,也被称为顺序栈.
通常用top指向栈顶元素,反应栈中元素变化情况;bottom表示栈底,在运算当中维持不变
栈:
•栈在日常生活中的实例也很常见,例如,把米桶看作是一个栈,最先放入的大米最后才会被取出来,而最后放入的大米最先被取出来.
•物流车也可以被看作是一个栈,最先装进入的快递最后才会被取出来,最后装入的快递最先被取出来,遵循的也是"先进后出"或"后进先出"的原则.
栈的基本运算:
入栈运算:从栈顶位置插入新元素的操作称为火线.
插入一个元素,栈顶指针top加1,指向新插入元素的位置,因此,栈顶指针top的动态变化能反映栈中元素的变化情况.
当栈满时,不能继续做入栈操作,若继续入栈,就会产生"上溢"错误.
出栈运算:从栈顶位置取出栈顶元素的操作称为出栈.
当栈不为空时,从栈顶位置取出栈顶元素的操作称为"出栈".取出一个元素,栈顶指针top减1,指向新的栈顶元素所在的位置.
当栈空时,不能继续做出栈操作,若继续出栈,就会产生"下溢"错误.
读栈顶运算:当栈不为空时,将栈顶元素赋给一个指定变量的操作称为读栈顶元素.
做题技巧:当题目中出现栈的存储空间为S(1:n),初始状态为top=0,top=-1,或top=n+1,初始状态都按空栈处理.
带链的栈:
栈是一种线性结构,既可以采用顺序存储也可以采用链式存储.采用链式存储的栈称为链栈,也可以称为带链的栈.栈链不要求逻辑上相邻的两个元素在物理位置上也相邻.
在实际应用上,带链的栈可以用来收集计算机存储空间中所有空闲的存储结点,这种带链的栈称为可利用栈.可利用栈总是处于动态变化之中,其栈顶指针和栈底指针会随着栈的操作而动态变化.
队列:
队列的概念:
队列也是一种操作受限的线性表,限定他只能在一端进行插入操作,在另一端进行删除操作.允许删除元素的一端称为对头,允许插入元素的一端称为队尾.由于先插入的元素总是先删除,后插入的元素总是后删除.因此,队列也被称为"先进先出"或"后进后出".
队列的基本运算:
入队和退队操作是队列的基本运算操作.在队列的基本运算中,通常用front表示队头指针(排头指针),用rear表示队尾指针.
当队列不满时,在队尾插入新元素的操作称为入队操作.当对列不为空时,在对头删除元素的操作称为退队操作.退队操作会引起对头指针front的变化,入队操作会引起队尾指针rear的变化.(退队从头退,入队从尾入,相当于一群人过独木桥,只能前进不能后退的那种)
循环队列
在实际应用中,队列的顺序结构存储结构一般采用的是循环队列的形式.
循环队列是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间.
在循环队列中,用队尾指针rear指向队尾元素,用对头指针front指向对头元素的前一个位置,因此,从排头指针front指向的后一个位置直到队尾指针rear指向的位置之间所有的元素均为队列中的元素.
循环队列中计算元素个数
第一种情况:rear>front
元素个数:rear-front
第二种情况:rear<front
元素个数:(rear-front)+循环队列长度
简短记忆:队尾减对头,够减直接减,不够再加Q
第三种情况:rear=front 循环队列为空(0个)或为满(Q个)
带链的队列:
队列也是一种线性结构,也可以采用链式存储结构.
与顺序队列相比,链式存储的队列在插入和删除元素时,操作更加简单,且链式队列也是动态分配的,易于扩充,但需要为队列种的逻辑关系增加额外的存储空间