2002年程序员试题及答案

发表于:2007-05-26来源:作者:点击数: 标签:
上午试题: ●数字签名技术可以用于对用户身份或信息的真实性进行验证与鉴定,但是下列的 (l) 行为不能用数字签名技术解决。 (1):A.抵赖 B.伪造 C.篡改 D,窃听 ●软件是一种 (2) 的产品。为了软件产业的健康发展,应对软件产品的 (3) 上进行保护。 (2)

上午试题:

●数字签名技术可以用于对用户身份或信息的真实性进行验证与鉴定,但是下列的  (l)  行为不能用数字签名技术解决。
    (1):A.抵赖    B.伪造    C.篡改    D,窃听
●软件是一种  (2)  的产品。为了软件产业的健康发展,应对软件产品的  (3)  上进行保护。
    (2)  A、易复制    B、易损坏    C、易开发    D、易使用
    (3)  A、 技术     B、版权      C、开发      D、使用说明
●用户提出需求并提供经费,委托软件公司开发软件。如果双方商定的协议中未涉及软件著作权归属,则软件著作权属于  (4)  所有。
    (4)  A、用户    B、软件公司    C、用户、软件公司双方    F、经裁决所确认的一方
●  (5)  是面向对象程序设计语言不同于其它语言的主要特点。是否建立了丰富的  (6)  是衡量一个面向对象程序设计语言成热与否的一个重要标志。  (7)  是在类及子类之间自动地共享数据和方法的一种机制。
    (5)  A、继承性    B、消息传递  C、多态性      D、静态联编
    (6)  A、函数库    B、类库      C、类型库      D、方法库
    (7)  A、调用      B、引用      C、消息传递    D、继承
●前序遍历序列与中序遍历序列相同的二叉树为  (8)  ,前序遍历序列与后序遍历序列相同的二叉树为  (9)  。
    (8)  A、根结点无左子树的二叉树
B、根结点无右子树的二叉树
        C、只有根结点的二叉树或非叶子结点只有左子树的二叉树
        D、只有根结点的二叉树或非叶子结点只有右子树的二叉树
    (9)  A、非叶子结点只有左子树的二叉树
B、只有根结点的二叉树
C、根结点无右子树的二叉树
D、非叶子结点只有右子树的二叉树
●  假设一棵二叉树的后序遍历序列为DGJHEBIFCA,中序遍历序列为DBGEHJACIF,则其前序遍历序列为  (10)  。
    (10)  A、ABCDEFGHIJ    B、ABDEGHJCFI    C、ABDEGHJFIC    D、ABDEGJHCFI
●已知一个线性表(38,25,74,63,52,48),采用的散列函数为H(Key)=Key mod 7,将元素散列到表长为7的哈希表中存储。若采用线性探测的开放定址法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为  (11)  ;若利用拉链法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为  (12)  。
    (11)  A、1.5    B、1.7    C、2.0    D、2.3
    (12)  A、1.0    B、7/6    C、4/3    D、3/2
●编译器和解释器是两种高级语言处理程序,与编译器相比,  (13)  。编译器对高级语言源程序的处理过程可以划分为词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等几个阶段:其中,代码优化和  (14)  并不是每种编译器都必需的。词法分析的作用是识别源程序中的  (15)  ;语法分析中的预测分析法是  (16)  的一种语法分析方法;编译器在  (17)  阶段进行表达式的类型检查及类型转换。
    (13)  A、解释器不参与运行控制,程序执行的速度慢
         B、解释器参与运行控制,程序执行的速度慢
         C、解释器参与运行控制,程序执行的速度快
         D、解释器不参与运行控制,程序执行的速度快
    (14)  A、词法分析    B、语法分析    C、中间代码生成    D、语义分析
    (15)  A、字符串    B、单词    C、标识符    D、语句
    (16)  A、自左至右    B、自顶向下    C、自底向上    D、自右至左
    (17)  A、词法分析    B、语法分析    C、语义分析    D、目标代码生成
●  当程序运行陷于死循环时,说明程序中存在  (18)  。在C语言中,函数定义及函数调用应该遵循的原则是  (19)  。以求n!为例,采用递归方式编写的程序相对于递推方式的程序执行效率较低的原因是  (20)  。
    (18)  A、语法错误    D、静态的语义错误    C、词法错误    D、动态的语义错误
    (19)  A、可以进行函数的嵌套定义,不可以进行函数的嵌套调用
         B、不可以进行函数的嵌套定义,可以进行函数的嵌套调用
         C、既可以进行函数的嵌套定义,也可以进行函数的嵌套调用
         D、既不能进行函数的嵌套定义,也不能进行函数的嵌套调用
    (20)  A、递归程序经编译后形成较长目标代码,所以需要较多的运行时间
B、递归程序执行时多次复制同一段目标代码占用了较多的时间
C、递归程序执行时一系列的函数调用及返回占用了较多的时间
D、递归程序执行过程中重复存取相同的数据占用了较多的时间
● 白盒测试方法一般适合用于  (21)  测试。
(21)  A、单元     B、系统     C、集成      D、确认
●瀑布模型(Waterfall Model)突出的缺点是不适应  (22)  的变动。
(22)  A、算法     B、平台     C、程序语言  D、用户需求
●在数据流图中, CD表示  (23)  。  表示  (24)  。             
  (23)  A、加工    B、外部实体  C、数据流    D、存储                   
  (24)  A、加工    B、外部实体  C、数据流    D、存储  
●结构化分析方法(SA)的一个重要指导思想是  (25)  。
(25)  A.自顶向下,逐步抽象
B.自底向上,逐步抽象
C.自顶向下,逐步分解
D.自底向上,逐步分解  
●软件从一个计算机系统转换到另一个计算机系统运行的难易程度是指软件(26)。
  在规定的条件下和规定的时间间隔内,软件实现其规定功能的概率称为(27)。
  (26)  A、兼容性    B、可移植性  C、可转换性  D、可接近性
  (27)  A、可使用性  B、可接近性  C、可靠性    D、稳定性
●Jackson设计方法是由英国的M.Jackson提出的,它是一种面向  (28)  的软件设计方法。
(28)  A. 对象    B.数据流    C.数据结构    D.控制结构
●系统中有四个作业,它们的到达时间、运行时间、开始时间、完成时间和周转时间如表1所示,该系统采用的作业调度算法是  (29)  。
表1
作业 到达时间 计算时间(分) 开始时间 完成时间 周转时间(分) 
J1 8:00 60 8:00 9:00 60 
J2 8:10 20 9:10 9:30 80 
J3 8:20 10 9:00 9:10 50 
J4 8:40 15 9:30 9:45 65 
(29)  A、先来先服务   B、短作业优先   C、响应比高者优先    D、不能确定●为了保证对系统中文件的安全管理,任何一个用户进入系统时都必须进行注册,通常将这一级安全管理称之为  (30)  安全管理。
在进程状态转换过程中,可能会引起进程阻塞的原因是  (31)  。计算机系统出现死锁是因为
  (32)  。    不通过CPU进行主存与I/0设备间大量的信息交换方式可以是  (33)  方式。
    (30)  A、用户级    B、系统级       C、文件级    D、目录级
    (31)  A、时间片到  B、执行V操作   C、I/O完成    D、执行P操作
    (32)  A、系统中有多个阻塞进程
         B、资源数大大小于系统中的进程数
         C、系统中多个进程同时申请的资源总数大大超过系统资源总数.
         D、若干进程相互等待对方已占有的资源
    (33)  A、DMA    B、中断    C、查询等待    D、程序控制
●  设某种二叉树有如下特点;结点的子树数目不是2个,则是0个。这样的一棵二叉树中有m(m>O)个子树为0的结点时,该二叉树上的结点总数为  (34)  。
    (34)  A.2m+l    B.2m-1    C.2(m-1)    D.2(m+1)
●数据库系统实现数据独立性是因为采用了  (35)  。当两个子查询的结果  (36)  时,可以执行并、交、差操作。SELECT语句中“SELECT  DISTINCT”表示查询结果中  (37)  。若4元关系R为:R(A,B,C,D),则  (38)  。给定关系模式学生(学号,课程号,名次),若每一名学生每门课程有一定的名次,每门课程每一名次只有一名学生,则以下叙述中错误的是  (39)  。
    (35)  A、层次模型 B、网状模型    C、关系模型  D、三级模式结构
    (36)  A、结构完全不一致    B、结构完全一致    C、结构部分一致    D、主键一致
    (37)  A、去掉相同的属性名    B、去掉了重复的列   
C、行都不相同          D、属性值都不相同
(38) A、 (R)为取属性值为A、C的两列组成新关系
B、 (R)为取属性值为A、C的两列组成新关系
C、 (R)与 (R)是等价的
D、 (R)与 (R)是不等价的
    (39)  A、(学号,课程号)和(课程号,名次)都可以作为候选键
B、只有(学号,课程号)能作为候选键
C、关系模式属于第三范式
D、关系模式属于BCNF
● 关系R和S如下表所示,关系代数表达式 的结果为  (40)  ,与该表达式等价的SQL语句为  (41)  。
R关系 A B C  a b c  b a d  c d e  d f g   S关系 A B E  b a d  d f g  c d k  h c l   
(40)
A、 A B  a b  b a  c d  d f   B、 A B  a a  b f  c b  d c   C、 A B  a f  a d  b f  c f   D、 A B  b a  d f  c d  h c   
(41)  A、SELECT  A,B  FROM  R,S  WHERE  C<B
B、SELECT  R.A,S.B  From  R,S  WHERE  R.C<S.B
C、SELECT  A,B  FROM  R  WHERE  C<(SELECT  B  FROM  S)
D、SELECT  1,5   FROM  R  WHERE  C<(SELECT  B  FROM  S)
●对动态图像进行压缩处理的基本条件是:动态图像中帧与帧之间具有  (42)  。
    (42)  A、相关性  B、无关性    C、相似性    D、相同性
●在显存中,表示黑白图像的像素点最少需(43)位。彩色图像可以用  (44)  三基色表示。
    (43)  A、1    B、2    C、3    D、4
    (44)  A、红黄蓝    B、红绿蓝    C、绿黄蓝    D、红绿黄
●以像素点阵形式描述的图像称为  (45)  。
    (45)  A、位图    D、投影图    C、矢量图    D、几何图
●用n个二进制位表示带符号纯整数时,已知[X]补、[Y]补,则当  (46)  时,
等式[X]补+[Y]补=[X+Y]补如成立。
(46) A、-2n≤(X+Y) ≤2n-1       B、-2n-1≤(X+Y) <2n-1
C、-2n-1-1≤(X+Y) ≤2n-1    D、-2n-1≤(X+Y)< 2n
●  对于16位的数据,需要(47)个校验位才能构成海明码。
    在某个海明码的捧列方式D9D8D7D6D5D4P4D3D2D1P3D0P2P1中,其中Di(0≤i≤9)表
示数据位,Pj(1≤j≤4)表示校验位,数据位D8由  (48)  进行校验。
(47)  A、3    B、4    C、5    D、6
(48)  A、P4P2P1   B、P4P3P2   C、P4P3P1   D、P3P2P1
●在以下逻辑电路图中,当(49)时,F=A⊕B~当(50)时,F=A∨B。
(49)   A、X=0,Y=0    B、X=0,Y=1   C、X=1,Y=1    D、X=1,Y=0
(50)   B、X=0,Y=1    B、X=0,Y=0   C、X=1,Y=1    D、X=1,Y=0
●    (51)  。
(51)   A、    B、   C、    D、
● 设机器码的长度为8位,已知x,z为带符号纯整数,y为带符号纯小数,
[X]原=[Y]补+[Z]移=11111111,求出x、y、z的十进制真值:X=  (51)   ,
Y=  (53)  ,Z=  (54)  。
    (52)  A、-1    B、127    C、-127    D、1
    (53)  A、1/128    B、-1/128    C、-127/128    D、127/128
    (54)  A、-1    B、127    C、-127    D、1
●某系统总线的一个总线周期包含3个时钟周期,每个总线周期中可以传送32位数据。若总线的时钟频率为33MHz,则总线带宽为  (55)  。
    (55)  A.132MB/s    B.33MB/s    C.44MB/s    D.396MB/s
●计算机指令系统中采用不同寻址方式的主要目的是  (56)  。在下列寻址方式中取得操作数速度最慢的是  (57)  。
    (56)   A、可直接访问内存或外存
B、提供扩展操作码并降低指令译码难度
C、简化汇编指令的设计
D、缩短指令长度,扩大寻址空间,提高编程灵活性
 (57)  A、相对寻址       B、基址寻址
C、寄存器间接寻址    D、存储器间接寻址
●某硬盘中共有9个盘片,16个记录面,每个记录面上有2100个磁道,每个磁道分为64个扇区,每扇区为512字节,则该硬盘的存储容量为  (58)  。磁盘的位密度随着磁道从内向外而  (59)  。
    (58)  A、590.6MB  B、9225MB    C、1050MB  D、1101MB
    (59)  A、减少    B、不变    C、增加    D、视磁盘而定
●  对8位补码操作数(A5)16,进行2位算术右移的结果为  (60)  。
    (60)  A、(D2)16    B、(52)16   C、(E9)16    D、(69)16
●  通过电话线连接因特网,可以使用的链路层协议有SLIP和  (61)  ,这种情况下给主机  (62)  一个IP地址。如果通过N-ISDN连网,用户可以使用的信道带宽是2B+D,数据速率最大可达到  (63)  。如果通过局域网连接因特网,接入方式可以采用ADSL,最高下行速率可以达到  (64)  。CHINADDN是中国电信提供的数字数据网,它采用  (65)  的交换技术为用户提供不同速率的专线连接。
    (61)  A、PPP    B、HDLC    C、Ethe.net    D、POP
    (62)  A、静态分配    B、动态分配    C、自动产生    D、不分配
    (63)  A、56kb/s     B、64kb/s    C、128kb/s    D、144kb/s
    (64)  A、1.544Mb/s  B、2.048MB/s  C、8Mb/s    D、l0Mb/s
    (65)  A、时分多路    B、空分多路    C、码分多址    D、频分多路
● In C language, one method of communicating data between functions is by   (66)  。
(66)  A、arguments  B、variables  C、messages   D、constants
● In C program,all variables must be   (67)   before use, usually at the beginning of the function before any   (68)   statements。
(67)  A、stated     B、instructed   C、illustrated   D、declared
(68)  A、operative  B、active      C、executable   D、processing
● When a string constant is written in C program, the compiler creates   (69)   of characters containing the characters of the string, and terminating it with “\0”.
(69)  A、a group    B、an array    C、a set    D、a series
● In C language,     (70)   variables have to be defined outside function, this    (71)   actual storage for it.
(70)  A、internal   B、output   C、export   D、external
(71)  A、locates    B、allocates   C、finds   D、looks for
●In C language, the increment and decrement    (72)   can only be applied to variables, so an expression like x=(i+j)++ is illegal.
(72)  A、operation   B、operate   C、operator   D、operand
● In C program, it is convenient to use a   (73)   to exit from a loop.
(73)  A、end   B、break   C、stop    D、quit
● In C language,   (74)   is a collection of one or more variables, possibly of different types, grouped together under a single name for convenient handling.
(74)  A、a structure    B、a file    C、an array    D、a string
● In C language, the usual expression statements are   (75)   or function calls.
(75)  A、I/Os     B、assignments   C、operations   D、evaluations

下午试题:

试题一
    阅读下列算法说明和算法,将应填入  (n)  处的字句写在答题纸的对应栏内。
[算法说明]
    为便于描述屏幕上每个像素的位置,在屏幕上建立平面直角坐标系。屏幕左上角的像素设为原点,水平向右方向设为x轴,垂直向下方向设为y轴。
    设某种显示器的像素有128X128,即在每条水平线和每条垂直线上都有128个像素。这样,屏幕上的每个像素可用坐标(x,y)来描述其位置,其中x和y都是整数,0≤x≤127,0≤y≤127。
    现用一维数组MAP来存储整个一屏显示的位图信息。数组的每个元素有16位二进位,其中每位对应一个像素,“1”表示该像素“亮”,“0”表示该像素“暗”。数组MAP的各个元素与屏幕上的像素相对应后,其位置可排列如下:
MAP(0),MAP(1),……,MAP(7)
MAP(8),MAP(9),……,MAP(15)
……
MAP(1016),MAP(1017),……,MAP(1023)
    下述算法可根据用户要求,将指定坐标(x,y)上的像素置为“亮”或“暗”。
    在该算法中,变量X,Y,V,S,K都是16位无符号的二进制整数。数组BIT中的每个
元素BIT(K)(K=0,…,15)的值是左起第K位为1,其余位均为0的16位无符号二进制整
数,即BIT(K)的值为2l5-k。
[算法]
第1步根据用户指定像素的位置坐标(x,y),算出该像素的位置所属的数组元素MAP(V)。这
    一步的具体实现过程如下:
    1、将x送变量X,将y送变量Y;
    2、将Y左移  (1)  位,仍存入变量Y;
    3、将X右移  (2)  位,并存入变量S;
    4、计算Y+S,存入变量V,得到像素的位置所属的数组元素MAP(V)。
第2步算出指定像素在MAP(V)中所对应的位置K(K=0,…,15)。这一步的具体实现过程如下:
将变量X与二进制数  (3)  进行逻辑乘运算,并存入变量K。
第3步根据用户要求将数组元素MAP(V)左起第K位设置为”1”或”0”。这一步的具体实现过程
    如下:    ,
    1、为在指定像素置“亮”,应将MAP(V)与BIT(K)进行逻辑  (4)  运算,并存入MAP(V)。
    2、为在指定像素置“暗”,  应先将BIT(K)各位取反,再将MAP(V)与BIT(K)进行逻辑  (5)  运算,并存入MAP(V)。

 

  试题二
      阅读下列函数说明和C代码,将应填入-匹l处的字句写在答题纸的对应栏内。
  [函数2.1说明]
      函数strcat(char *si,char *s2)是将字符串s2连接在字符串si之后,构成一个首指
  针为s1的字符串。
  [函数2.1]   
  void strcat(char *sl,char *s2)
  {  while(*s1!='\0')    ;
       (1)    :
    for( ;  (2)  ;s1++,s2++);
  }
 [函数2.2说明]    .
      本函数输入n(<1000)个整数到指定数组,求该数组中最大元素的值和此元素的下标,最大元素值以函数值返回,此元素的下标通过指针形参带回调用处。
  [函数2.2]
  #include<stdio.h>
  #define MAXLINE  1000
  int maxindex(int a[],int *index)
  {  int i,n;
     do  {
         printf("Please input n\n");
         scanf("%d",&n);
     }while(  (3)  );/*保证输入的n在限定范围内*/
     for(i=0 ; i<n ; i++)
        scanf("%d",&a[i]);
     *index=0;
     for(i=1 ; i<n ; i++)
        if(  (4)  )  *index=i;
    return   (5)  ;
  }
试题三
    阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。
  [函数3.1说明]
    函数insert_sort(int a[],int count)是用直接插入排序法对指定数组的前count个元素从小到大排序。
直接插入排序法的基本思想是:将整个数组(count个元素)看成是由有序的(a[0],…,a[i-1])和无序的(a[i],…,a[Count-1))两个部分组成;初始时i等于1,每趟排序时将无序部分中的第一个元素a[i]插入到有序部分中的恰当位置,共需进行count-1趟,最终使整个数组有序。
[函数3.1]
void insert_sort(int a[] , int count)
{   int i, j, t;
    for(i=1 ; i<count ; i++)
{  /*控制a[i],……, a[count-1]的比较和插入*/
   t=a[i];
   j=  (1)  ;
   while (j>=0 && t<a[j])
   {  /*在有序部分中寻找元素a[i]的插入位置*/
         (2)   ;
      j--;
   }
     (3)  ;
}
}
[函数3.2说明]
    递归函数invert(int a[],int k)将指定数组中的前k个元素逆置。
[函数3.2]
void invert(int a[] , int k);
{   int t;
if (  (4)  )  {
  invert(  (5)  );
  t=a[0];
  a[0]=a[k-1];
  a[k-1]=t;
}
}
试题四
    阅读下列程序说明和C代码,将应填入  (n)  处的字句写在答题纸的对应栏内。
[程序4说明]
    本程序用古典的Eratosthenes的筛法求从2起到指定范围内的素数。如果要找出2至10中的素数,开始时筛中有2到10的数,然后取走筛中的最小的数2,宣布它是素数,并把该素数的倍数都取走。这样,第一步以后,筛子中还留下奇数3、5、7、9:重复上述步骤,再取走最小数3,宣布它为素数,并取走3的倍数,于是留下5、7。反复重复上述步骤,直至筛中为空时,工作结束,求得2至10中的全部素数。
程序中用数组sieve表示筛子,数组元素sieve[i]的值为1时,表示数i在筛子中,值为-1时表示数i已被取走。
[程序4]
#include <stdio.h>
#define MAX 22500
main()
{  unsigned int i , range , factor , k ;
   int sieve[MAX] ;
   printf(“please input the range : ”);
   scanf(“%d”,&range);  /*range指出在多大的范围内寻找素数 */
   for (i=2 ; i<=range ; i++)  /* 筛子初始化 */
         (1)  ;
   factor=2 ;
   while (factor<=range)  {
      if (  (2)  )   {   /*筛子最小数是素数 */
        printf(“%d\t”,factor);
        k=factor;
        while (k<=range) 
{  /*移走素数的倍数 */
      (3)  ;   /*筛中的个数减一 */
   k=  (4)  ;
}
         }
            (5)  ;
    }
试题五
    阅读下列函数说明和C代码,将应填入  (n)  处的字句写在答题纸的对应栏内。
设二叉树的结点数据类型为:
    typedef struct node{
       char data;
       struct node *left;
       struct node *right:
    }BTREE;
[函数5.1说明]
    函数void SortTreelnsert(BTREE **tree,BTREE*s)采用递归方法,将结点s插入以*tree为根结点指针的二叉排序树(二叉查找树)中。
[函数5.1)
    void SortTreelnsert(BTREE **tree,BTREE *S)
    { if(*tree = = NULL)  *tree=S;
      else if(S->data<(*tree)->data)
             SortTreelnsert(  (1)  ,S);
           else if(S->data>(*tree)->data)
                SortTreelnsert(  (2)  ,S);
}
[函数5.2说明]
    函数void TraversalTree(BTREE *tree)用非递归方法,对以tree为根结点指针的二叉树进行后序遍历。
[函数5,2]
    void TraversalTree(BTREE *tree)
    {  BTREE *stack[1000],*p;
       int tag[1000],top=0;
       p=tree;
       do  {
          while(p!=NULL){
             stack[++top]=p;
                (3)    ;
             tag[hop]=0;  /*标志栈顶结点的左子树已进行过后序遍历*/  :
           }
           while(top>0 &&   (4)   ){  /* 栈顶结点的右子树是否被后序遍历过*/
               p=stack[top--];
               putchar(p->data);
           }
           if (top>0) {    /*对栈顶结点的右子树进行后序遍历*/
                 (5)    ;
             tag[top]=1;
           }
        }while(top>0);
    }

参考答案:

上午答案
 
(1)D (2)A (3)B (4)B (5)A
(6)B (7)D (8)D (9)B (10)B
(11)C (12)C (13)B (14)C (15)B
(16)B (17)C (18)D (19)B (20)C
(21)A (22)D (23)A (24)D (25)C
(26)B (27)C (28)C (29)C (30)A
(31)D (32)D (33)A (34)B (35)D
(36)B (37)C (38)C (39)B (40)C
(41)B (42)A (43)A (44)B (45)A
(46)B (47)C (48)C (49)C (50)D
(51)B (52)C (53)B (54)B (55)C
(56)D (57)D (58)C (59)A (60)C
(61)A (62)B (63)D (64)C (65)A
(66)A (67)D (68)C (69)B (70)D
(71)B (72)A (73)A (74)C (75)D

 


下午答案
试题一 试题二
(1) 3 (1) s1++
(2) 4 (2) *s1= *s2
(3) 1111  (3) n<=0 ? ? n>=MAXLINE
(4) 或(加) (4) a[i] > a[*index]
(5) 与(乘) (5) a[*index]
 

试题三 试题四
(1) i-1 (1) sieve[i] = 1
(2) a[j+1] = a[j] (2) sieve[factor] == 1 或 sieve[factor] > 0 或 sieve[factor] >= 0 或 sieve[factor] != -1
(3) a[j+1] = t (3) sieve[k] = -1
(4) k > 1 (4) k+factor
(5) a+1 , k-2 (5) factor++
 

试题五 
(1) &((*tree) -> left) 
(2) &((*tree) -> right) (4)tag[top] == 1 或 tag[top] 或 tag[top] != 0
(3) p = p -> left 或 p = stack[top] -> left (5) p = stack[ top ] -> right

原文转自:http://www.ltesting.net