栈---面试知识点整理

栈的基本运算

 (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)

 

在栈中,栈底指针保持不变,有元素入栈,栈顶指名增加,有元素出栈,栈顶指针减少。在循环队列中,队头指针和队尾指针的动态变化决定队列的长度。在循环链表中,前一个结点指向后一个结点,而最后一个结点指向头结点,只有头结点是固定的。线性链表中,由于前一个结点包含下一个结点的指针,尾结点指针为空,要插入或删除元素,只需要改变相应位置的结点指针即可,头指针和尾指针无法决定链表长度。

 

栈是先进后出的数据结构,在整个过程中,栈底指针不变,入栈与出栈操作均由栈顶指针的变化来操作

 

栈顶元素总是后被插入的元素,从而也是最先被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。栈的修改是按后进先出的原则进行的。因此,栈称为先进后出表,或“后进先出”表

 

posted @ 2017-04-06 14:51  walanwalan  阅读(682)  评论(0编辑  收藏  举报