栈---面试知识点整理
栈的基本运算
(1)InitStack(S)
构造一个空栈S。
(2)StackEmpty(S)
判栈空。若S为空栈,则返回TRUE,否则返回FALSE。
(3)StackFull(S)
判栈满。若S为满栈,则返回TRUE,否则返回FALSE。
(4)Push(S,x)
进栈。若栈S不满,则将元素x插入S的栈顶。
(5)Pop(S)
退栈。若栈S非空,则将S的栈顶元素删去,并返回该元素。
(6)StackTop(S)
取栈顶元素。若栈S非空,则返回栈顶元素,但不改变栈的状态
堆栈溢出一般是由什么原因导致的?
(1)可能是由于循环的递归引起的。
(2)由于分配了过大的局部变量引起。
表达式3*2^(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和运算符栈为(),其中^为乘幂
对象栈:3,2,8;算符栈:*,^,(,- 。
具体过程:
第一次:对象栈:3;算符栈:*;
第二次:对象栈:3,2;算符栈:*,^,(;
第三次:对象栈:3,2,4;算符栈:*,^,(,+;
第四次:对象栈:3,2,4,2;算符栈:*,^,(,+,*;
第五次:对象栈:3,2,4,4;算符栈:*,^,(,+;
第六次(扫描到6):对象栈:3,2,8;算符栈:*,^,(,- 。
递归工作栈里面包括返回地址、本层的局部变量和递归调用的形参代换用实参,所以正常情况下,无论递归过程有没有使用局部变量,转换为非递归过程都需要用栈来模拟这个递归调用过程 。当然,有一些特殊递归不用栈就可以直接转换,比如尾递归、常系数递推等,无论是否有局部变量
n个数顺序(依次)入栈,出栈序列有Cn种,Cn=[1/(n+1)]*(2n)!/[(n!)*(n!)]
二叉链存储法也叫孩子兄弟法,左指针指向左孩子,右指针指向右兄弟。而中序遍历的顺序是左孩子,根,右孩子。这种遍历顺序与存储结构不同,因此需要堆栈保存中间结果。
而中序遍历检索二叉树时,由于其存储结构跟遍历顺序相符,因此不需要用堆栈。
若要删除book表中的所有数据,如下哪些语法是错误的?
drop table book 是删除整个表,题目的潜在意思是删除表中的数据而并非删除整个表。
truncate table book 是删除表中的数据,删除速度比delete更快,无法撤回(回退)。
delete from book 删除数据表中的数据,可以回退,可添加where 子句。
递归之所以可以采用非递归方法实现是因为可以用栈的方式
如果你采用递归时 是由系统管理函数栈
而要写成非递归时必须由你自已来管理一个栈.
后缀式 ab+cd+/可用表达式( )来表示
过程如下:
a入栈
b入栈
遇到+号,取栈里的两个操作数,即a和b,计算a+b,结果入栈
c入栈
d入栈
遇到+号,取栈里的两个操作数,即c和d,计算c+d,结果入栈
遇到/,取栈里的两个操作数,即(a+b)和(c+d),计算( a+b)/(c+d)
在栈中,栈底指针保持不变,有元素入栈,栈顶指名增加,有元素出栈,栈顶指针减少。在循环队列中,队头指针和队尾指针的动态变化决定队列的长度。在循环链表中,前一个结点指向后一个结点,而最后一个结点指向头结点,只有头结点是固定的。线性链表中,由于前一个结点包含下一个结点的指针,尾结点指针为空,要插入或删除元素,只需要改变相应位置的结点指针即可,头指针和尾指针无法决定链表长度。
栈是先进后出的数据结构,在整个过程中,栈底指针不变,入栈与出栈操作均由栈顶指针的变化来操作
栈顶元素总是后被插入的元素,从而也是最先被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。栈的修改是按后进先出的原则进行的。因此,栈称为先进后出表,或“后进先出”表