1.定义正读和反读都相同的字符序列为“回文”,例如,“abcdcba”是回文,“ashgash”不是回文。试写一个算法判断读入的一个以‘@’为结束符的字符序列是否为回文。
int IsReverse(){
PseqStack S;
PseqQueue Q;
char e,x,y;
S=Init_SeqStack(); //初始化栈 S
Q=Init_SeqQueue(); //初始化队列 Q
While((e=getchar())!='@'){ //遇到@停止输入
Push_SeqStack(S,e); //e进栈
In_SeqQueue(Q,e); //e进队列
}
while(!Empty_SeqStack(S)||!Empty_SeqQueue(Q)){
Out_SeqStack(S,&x); //栈顶元素出栈
Pop_SeqQueue(Q,&y); //队头元素出队
if(x!=y)
return 0;
}
return 1; //所有元素比较完毕,未出现不同,是回文
}
2.V2. 已知线性表(a1,a2, a3 ,…,an)按顺序存于内存,每个元素都是整数,试设计用最少时间和空间代价,把所有值为负数的元素移到全部非负数值元素前边的算法:例:(x,-x,-x,x,x,-x …x)变为(-x,-x,-x…x,x,x)(其中:x>0)。假设线性表的存储结构为:
typedef struct node {
DataType data[MAXSIZE];
int length;
} SeqList, *PSeqList;
void divide(SeqList L){
int low=0;
int high=L->length-1;
while(low<high){
while(low<high&&L->data[high]>0) high--; //从后向前遍历,直到遇到负数停止
while(low<high&&L->data[low]<0) low++; //从前往后遍历,指导遇到正数
if(low<high){ //交换元素
int temp=L->data[low];
L->data[low]=L->data[high]
L->data[low]=temp
}
}
}
3,已知一棵二叉树采用二叉链表存储,定义二叉树中结点x的根路径为从根结点到x结点的一条路径,请编写算法输出该二叉树中最长的一条根路径(如存在多条最长根路径,只输出一条即可)假设二叉树结点的存储结构为:
typedef char DataType; //设结点内容的数据类型为字符型
typedef struct bnode {
DataType data;
struct bnode *lchild, *rchild;
} Bnode, *BTree ;
int depths(BTree T,DataType a[],int &MaxLen,DataType b[],int &CurrentLen) {
//MaxLen和CurrentLen初始值为0
if(T==null){ //当前路径为最长路径
if(MaxLen<CurrenLen){
for(int i=0;i<CurrentLen;i++){ /!!!!!!!!!!!!注意不是 i<=CurrentLen
a[i]=b[i]; //当前路径存入a数组
}
MaxLen=CurrentLen;
}
}
else{
b[CurrentLen++]=T->data; //记录当前结点的值
depth(T->lchild,a,&MaxLen,b,&CurrentLen);
depth(T->rchild,a,&MaxLen,b,&CurrentLen);
--CurrentLen;
}
}