| 解:
 算法如下
 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
 |