【编程练习题】
本章编程练习题中可以利用的栈和队列的类型定义如下: //
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 项。
|