知识大全 第3章栈和队列习题练习答案

Posted 元素

篇首语:缥帙各舒散,前后互相逾。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 第3章栈和队列习题练习答案相关的知识,希望对你有一定的参考价值。

设将整数 依次进栈 但只要出栈时栈非空 则可将出栈操作按任何次序夹入其中 请回答下述问题    ( )若入 出栈次序为Push( ) Pop() Push( ) Push( ) Pop() Pop( ) Push( ) Pop( ) 则出栈的数字序列为何(这里Push(i)表示i进栈 Pop( )表示出栈)?   ( )能否得到出栈序列 和 ?并说明为什么不能得到或者如何得到    ( )请分析 的 种排列中 哪些序列是可以通过相应的入出栈操作得到的     ( )出栈序列为     ( )不能得到 序列 因为要得到 的出栈序列 则应做Push( ) Pop() Push( ) Push    ( ) Push( ) Pop() 这样 在栈顶 在栈底 所以不能得到 的出栈序列 能得到 的出栈序列 具体操作为 Push( ) Pop() Push( ) Push( ) Push( ) Pop() Pop() Pop()   ( )在 的 种排列中 可通过相应入出栈操作得到的序列是             不能得到的序列是     

链栈中为何不设置头结点?     链栈不需要在头部附加头结点 因为栈都是在头部进行操作的 如果加了头结点 等于要对头结点之后的结点进行操作 反而使算法更复杂 所以只要有链表的头指针就可以了

循环队列的优点是什么? 如何判别它的空和满? 答   循环队列的优点是 它可以克服顺序队列的 假上溢 现象 能够使存储队列的向量空间得到充分的利用 判别循环队列的 空 或 满 不能以头尾指针是否相等来确定 一般是通过以下几种方法 一是另设一布尔变量来区别队列的空和满 二是少用一个元素的空间 每次入队前测试入队后头尾指针是否会重合 如果会重合就认为队列已满 三是设置一计数器记录队列中元素总数 不仅可判别空或满 还可以得到队列中元素的个数

设长度为n的链队用单循环链表表示 若设头指针 则入队出队操作的时间为何? 若只设尾指针呢?    当只设头指针时 出队的时间为 而入队的时间需要n 因为每次入队均需从头指针开始查找 找到最后一个元素时方可进行入队操作 若只设尾指针 则出入队时间均为 因为是循环链表 尾指针所指的下一个元素就是头指针所指元素 所以出队时不需要遍历整个队列

指出下述程序段的功能是什么? ( ) void Demo (SeqStack *S)    int i; arr[ ] ; n= ;    while ( StackEmpty(S)) arr[n++]=Pop(S);    for (i= i< n; i++) Push(S arr[i]);    //Demo ( ) SeqStack S S tmp;  DataType x;   //假设栈tmp和S 已做过初始化  while ( ! StackEmpty (&S ))       x=Pop(&S ) ;    Push(&tmp x);     while ( ! StackEmpty (&tmp) )       x=Pop( &tmp);     Push( &S x);    Push( &S x);   ( ) void Demo ( SeqStack *S int m)     // 设DataType 为int 型    SeqStack T; int i;    InitStack (&T);    while (! StackEmpty( S))     if(( i=Pop(S)) !=m) Push( &T i);    while (! StackEmpty( &T))           i=Pop(&T); Push(S i);        ( )void Demo ( CirQueue *Q)    // 设DataType 为int 型    int x; SeqStack S;    InitStack( &S);    while (! QueueEmpty( Q ))     x=DeQueue( Q); Push( &S x);    while (! StackEmpty( &s))      x=Pop(&S); EnQueue( Q x );   // Demo ( ) CirQueue Q Q ; // 设DataType 为int 型  int x i n= ;   // 设Q 已有内容 Q 已初始化过  while ( ! QueueEmpty( &Q ) )     x=DeQueue( &Q ) ; EnQueue(&Q x); n++;  for (i= ; i< n; i++)     x=DeQueue(&Q ) ;   EnQueue( &Q x) ; EnQueue( &Q x);   ( )程序段的功能是将一栈中的元素按反序重新排列 也就是原来在栈顶的元素放到栈底 栈底的元素放到栈顶 此栈中元素个数限制在 个以内   ( )程序段的功能是利用tmp栈将一个非空栈s 的所有元素按原样复制到一个栈s 当中去   ( )程序段的功能是利用栈T 将一个非空栈S中值等于m的元素全部删去   ( )程序段的功能是将一个循环队列Q经过S栈的处理 反向排列 原来的队头变成队尾 原来的队尾变成队头   ( )这段程序的功能是将队列 的所有元素复制到队列 中去 但其执行过程是先把队列 的元素全部出队 进入队列 然后再把队列 的元素复制到队列 中

回文是指正读反读均相同的字符序列 如 abba 和 abdba 均是回文 但 good 不是回文 试写一个算法判定给定的字符向量是否为回文 (提示 将一半字符入栈)    根据提示 算法可设计为  //以下为顺序栈的存储结构定义 #define StackSize //假定预分配的栈空间最多为 个元素 typedef char DataType;//假定栈元素的数据类型为字符 typedef struct  DataType data[StackSize];  int top; SeqStack;  int IsHuiwen( char *t)  //判断t字符向量是否为回文 若是 返回 否则返回    SeqStack s;   int i len;   char temp;   InitStack( &s);   len=strlen(t); //求向量长度   for ( i= ; i<len/ ; i++)//将一半字符入栈    Push( &s t[i]);   while( !EmptyStack( &s))    // 每弹出一个字符与相应字符比较     temp=Pop (&s);     if( temp!=S[i])  return ;// 不等则返回      else i++;        return ; // 比较完毕均相等则返回   

利用栈的基本操作 写一个将栈S中所有结点均删去的算法void ClearStack( SeqStack *S) 并说明S为何要作为指针参数?    算法如下  void ClearStack (SeqStack *S)    // 删除栈中所有结点    S >Top = ; //其实只是将栈置空      因为要置空的是栈S 如果不用指针来做参数传递 那么函数进行的操作不能对原来的栈产生影响 系统将会在内存中开辟另外的单元来对形参进行函数操作 结果等于什么也没有做 所以想要把函数操作的结果返回给实参的话 就只能用指针来做参数传递了

利用栈的基本操作 写一个返回S中结点个数的算法 int StackSize( SeqStack S) 并说明S为何不作为指针参数? 解  算法如下   int StackSize (SeqStack S)   //计算栈中结点个数    int n= ;    if(!EmptyStack(&S))           Pop(&S);      n++;         return n;     上述算法的目的只要得到S栈的结点个数就可以了 并不能改变栈的结构 所以S不用指针做参数 以避免对原来的栈中元素进行任何改变 系统会把原来的栈按值传递给形参 函数只对形参进行操作 最后返回元素个数

设计算法判断一个算术表达式的圆括号是否正确配对 (提示 对表达式进行扫描 凡遇到 ( 就进栈 遇 ) 就退掉栈顶的 ( 表达式被扫描完毕 栈应为空     根据提示 可以设计算法如下  int PairBracket( char *SR)  //检查表达式ST中括号是否配对   int i;   SeqStack S; //定义一个栈   InitStack (&s);   for (i= ; i<strlen(SR) ; i++)          if ( S[i]== ( ) Push(&S SR[i]); //遇 ( 时进栈     if ( S[i]== ) ) //遇 )       if (!StackEmpty(S))//栈不为空时 将栈顶元素出栈       Pop(&s);      else return ;//不匹配 返回        if EmptyStack(&s) return ;// 匹配 返回    else return ;//不匹配 返回   

相关参考

知识大全 第6章树(算法设计)习题练习答案

*二叉树的遍历算法可写为通用形式例如通用的中序遍历为 voidInorder(BinTreeTvoid(*visit)(DataTypex))  if(T)    Inorder(T>lchil

知识大全 第10章文件习题练习答案

常见的文件组织方式有哪几种?各有何特点?文件上的操作有哪几种?如何评价文件组织的效率?答   常用的文件组织方式有顺序文件索引文件散列文件和多关键字文件   ●顺序文件的

知识大全 第2章线性表习题练习答案

试描述头指针头结点开始结点的区别并说明头指针和头结点的作用答   开始结点是指链表中的第一个结点也就是没有直接前趋的那个结点   链表的头指

知识大全 第8章排序(算法设计)习题练习答案

将哨兵放在R[n]中被排序的记录放在R[n]中重写直接插入排序算法解   重写的算法如下 voidInsertSort(SeqListR)  //对顺序表中记录

知识大全 第7章图(基础知识)习题练习答案

在图所示的各无向图中     ()找出所有的简单环 ()哪些图是连通图?对非连通图给出其连通分量 ()哪些图是自由树(或森林)?答: ()所有的简单环(同一个环可以任一顶点作为起点)   (a)   

知识大全 第9章查找(一)习题练习答案

对含有n个互不相同元素的集合同时找最大元和最小元至少需进行多少次比较? 答  设变量max和min用于存放最大元和最小元(的位置)第一次取两个元素进行比较大的放入max小的放入min从第次开

知识大全 第4章串习题练习答案

简述下列每对术语的区别  空串和空白串串常量和串变量主串和子串静态分配的顺序串和动态分配的顺序串目标串和模式串有效位移和无效位移答 ●空串是指不包含任何字符的串它的长度为零  空白串是指包含一个或多个

知识大全 第8章排序(基础知识)习题练习答案

以关键字序列()为例分别写出执行以下排序算法的各趟排序结束时关键字序列的状态 ()直接插入排序()希尔排序()冒泡排序()快速排序 ()直接选择排序()堆排序()归并排序()基数排序  上述方法中哪些

知识大全 第6章树(基础知识)习题练习答案

假设在树中结点x是结点y的双亲时用(xy)来表示树边已知一棵树边的集合为(im)(in)(ei)(be)(bd)(ab)(gj)(gk)(cg)(cf)(hl)(ch)(ac)用树形表示法出此树并回答

知识大全 第9章查找(二)习题练习答案

设散列表长度为散列函数h(x)=x%给定的关键字序列为试画出分别用拉链法和线性探查法解决冲突时所构造的散列表并求出在等概率情况下这两种方法查找成功和失败时的平均查找长度请问装填因子的值是什么?&nbs