【编程练习题】


  本章编程练习题中可以利用的栈和队列的类型定义如下:

 // stack 类型
 void InitStack( stack& s );  // 初始化 s 为空栈
 void Push( stack&s , char x); // 将元素 x 插入 s 的栈顶
 void Pop( stack& s );     // 删除 s 中的栈顶元素
 bool SEmpty( stack& s);    // 若栈 s 为空则返回 TRUE,否则返回 FALSE
 char GetTop( stack& s );   // 返回 s 中的栈顶元素
 void ClearStack( stack& s);  // 将栈 s 清空
 int StackLength( stack& s);  // 返回栈 s 中元素个数
 void DestroyStack( stack& s );// 销毁栈 s 结构

 // queue 类型
 void InitQueue( queue& q );   // 初始化 q 为空栈
 void EnQueue( queue& q , char x );// 将元素 x 插入 q 的队尾
 void Dequeue( queue& q);     // 删除 q 中队头元素
 char GetHead( queue& q );    // 返回 q 中队头元素
 bool QEmpty( queue& q);  // 若队列 q 为空则返回 TRUE,否则返回 FALSE
 void ClearQueue( queue& q );   // 将队列 q 清空
 int QueueLength( queue& q );   // 返回队列 q 中元素个数
 void DestroyQueue( queue& q );  // 销毁队列 q 结构

 1. 试写一个算法,识别依次读入的一个以 @ 为结束符的字符序列是否为形如'序列1&序列2'模式的字符序列。其中序列1和序列2中都不含字符'&',且序列2是序列1的逆序列。例如,'a+b&b+a'是属该模式的字符序列,而'1+3&3-1'则不是。
  bool matching(char* str)
 // 若给定字符串 str 为形如 "序列1&序列2" 的对称字符串
 // (序列2是序列1的逆串),则返回 true,否则返回 false

 2. 假设一个算术表达式中可以包含三种括号:圆括号"("和")",方括号"["和"]"和花括号"{"和"}",且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已存入数据元素为字符的顺序表中)。
  bool match_check( SqList exp )
 // 若给定的表达式 exp 中的三种括号:()、[]和{}均配对出现,
 // 则返回"true",否则返回"false"

 3. 假设表达式由单字母变量和双目四则运算算符构成。试写一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式。
  void transformation(char* rs, SqList exp)
 // 以字符串 rs 返回给定的表达式 exp(以'#'为结束标志)
 // 转换所得相应的后缀式

 4. 如题9的假设条件,试写一个算法,对以逆波兰式表示的表达式求值。
  int valuation( SqList suffixal )
 // 返回由给定逆波兰式 suffixal 表示的表达式的值。

 5. 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列和出队列的算法。
  void Init_Queue(LinkQueue& rear)
 // rear 是指向以循环链表表示的队列的队尾指针,初始化该循环链表队列。

 6. 假设将循环队列定义为:以域变量 rear 和 length 分别指示循环队列中队尾元素的位置和内含元素的个数。试给出此循环队列的队满条件,并写出相应的入队列和出队列的算法(在出队列的算法中要返回队头元素)。
  bool En_CQueue( CyclicQueue& Q, ElemType x )
 // Q 是一个由其尾指针和队列长度标识的循环队列,若队列不满,
 // 则将 x 插入至队尾,并返回 true ;否则返回 false

 7. 假设称正读和反读都相同的字符序列为"回文",例如,'abba' 和 'abcba'是回文,'abcde' 和 'ababab' 则不是回文。试写一个算法判别读入的一个以'@'为结束符的字符序列是否是"回文"。
  bool matching(char* rs)
 // rs 为一个随机产生的未知长度的(以@为结束符的)字符序列,
 // 若是"回文",则返回"true",否则返回"false"。

 8. 试利用如下说明的循环队列编写求 k 阶斐波那契序列中前 n+1 项的算法,要求满足:≤max 而 >max,其中 max 为某个约定的常数。(注意:本题所用循环队列的容量仅为 k,则在算法执行结束时,留在循环队列中的元素应是所求 k 阶斐波那契序列中的最后 k 项 ,…,)。
  struct CyclicQueue { // 循环队列
   int elem[k];
   int rear,front ; // 0..k-1;
  };
  void K_Fib( CyclicQueue& q, int k, ElemType max)
 // 计算K阶斐波那契序列中的前 N+1 项,即:
 // 要求 <=max 而 >max,函数运行结束时,
 // 留在队列中的元素恰为所求 K 阶斐波那契序列中的最后 K 项。

 
【编程练习题】