解: 算法如下 void ClearStack 因为要置空的是栈S,如果不用指针来做参数传递,那么函数进行的操作不能对原来的栈产生影响,系统将会在内存中开辟另外的单元来对形参进行函数操作。结果等于什么也没有做。所以想要把函数操作的结果返回给实参的话,就只能用指针来做参数传递了。 3.8 利用栈的基本操作, 写一个返回S中结点个数的算法 int StackSize,并说明S为何不作为指针参数? 解: 算法如下: int StackSize return n; } 上述算法的目的只要得到S栈的结点个数就可以了。并不能改变栈的结构。所以S不用指针做参数,以避免对原来的栈中元素进行任何改变。系统会把原来的栈按值传递给形参,函数只对形参进行操作,最后返回元素个数。 3.9 设计算法判断一个算术表达式的圆括号是否正确配对。 ‘就退掉栈顶的‘ if EmptyStack return 1;// 匹配,返回1 else return 0;//不匹配,返回0 } 3.10 一个双向栈S是在同一向量空间内实现的两个栈,它们的栈底分别设在向量空间的两端。 试为此双向栈设计初始化InitStack 、入栈Push 和出栈Pop等算法, 其中i为0 或1, 用以表示栈号。 解: 双向栈其实和单向栈原理相同,只是在一个向量空间内,好比是两个头对头的栈放在一起,中间的空间可以充分利用。双向栈的算法设计如下: //双向栈的栈结构类型与以前定义略有不同 #define StackSize 100 // 假定分配了100个元素的向量空间 #define char DataType typedef structDblStack void InitStack int EmptyStack int FullStack void Push DataType Pop 3.11 Ackerman 函数定义如下:请写出递归算法。 ┌ n+1 当m=0时 AKM = │ AKM 当m≠0 ,n=0时 └ AKM) 当m≠0, n ≠ 0时 解: 算法如下 int AKM 3.12 用第二种方法 ,即少用一个元素空间的方法来区别循环队列的队空和队满,试为其设计置空队,判队空,判队满、出队、入队及取队头元素等六个基本操作的算法。 解: 算法设计如下: //循环队列的定义 #define QueueSize 100 typedef char Datatype ; //设元素的类型为char型 typedef struct CirQueue; 置空队 void InitQueue 判队空 int EmptyQueue 判队满 int FullQueue 出队 DataType DeQueue 入队 void EnQueue 取队头元素 DataType FrontQueue |