第八章作业 栈与队列.doc
文本预览下载声明
11、设单链表中存放这n个字符,试编写算法,判断该字符串是否有中心对称关系,例如xyzzyx,xyzyx都算是中心对称的字符串。要求用尽少可能的时间完成判断。(提示:将一半字符先依次进栈)。
解答:
算法思想:
首先建立单链表结构,创建单链表creslink()函数使字符串存储在单链表中,此处采用的是尾插法。同时用getlen函数计算出单链表的长度即存储字符的个数,以便在栈中将前一半先依次进栈。
然后建立栈结构,此处采用的链栈存储方式存储栈。做出判栈空函数empty,初始化函数initstack,入栈push弹栈pop函数。
由于栈存储是先进后出,所以接着将一半字符进栈再出栈和剩下的一半元素实现比较是否相同,得到字符串是否为中心对称。注意此处单链表长度应有奇偶之分,如果是偶数时比较时是用第一个出栈元素和所剩后一半元素的第一个(即是p-next)比较,而奇数时是第一个出栈元素和所剩后一半元素的第二个(即是p-next-next)比较,
同时比较结果的实现是先置same=1,一旦比较中出现不相同就same=0,此时就break跳出循环。然后判断栈是否为空,即是否出栈完比较完了,若空则中心对称,若不空则不中心对称。
源代码:#includestdio.h
#includestdlib.h
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node * next;
}linkstack ;
typedef struct link
{
ElemType data;
struct link * next;
}slink;
int initstack(linkstack **S)//初始化操作
{
*S=(linkstack *)malloc(sizeof(linkstack));
if(*S==NULL) return 0;
(*S)-next=NULL;
return 1;
}
int empty(linkstack *S)//判栈空
{
if(S-next==NULL) return(1);
else return(0);
}
int push(linkstack *S,ElemType x)//入栈
{
linkstack *t;
t=(linkstack *)malloc(sizeof(linkstack));
if(!t) return 0;
t-data=x;
t-next=S-next;
S-next=t;
return 1;
}
int pop(linkstack *S,ElemType *e)//弹栈
{
linkstack *p;
if(empty(S))
{
printf(Stack Underflow);
return (0);
}
else
{
p=S-next;
*e=p-data;
S-next=p-next;
free(p);
return 1;
}
}
slink *creslink()//创建单链表
{
slink *head,*p,*s;
char ch;
head=(slink*)malloc(sizeof(slink));
p=head;
ch=getchar();
while(ch!=\n)
{
s=(slink*)malloc(sizeof(slink));
s-data=ch;
p-next=s;
p=s;
ch=getchar();
}
p-next=NULL;
return head;
}
int getlen(slink *head)//计算单链表的长度
{
slink *p;
int n;
p=head-next;n=0;
while (p!=NULL)
{n++;p=p-next;}
return n;
}
int fsame(slink *head)
{
ElemType x;
slink *p,*q;
p=head-next;
int len,i,same=1;
linkstack *S;
initstack(S);
len=getlen(p);
if(len%2==0)
{
for(i=0;ilen/2;i++)
{
push(S,p-data);
p=p-next;
}
q=p-next;
for(i=(len+1)/2;ilen;i++)
显示全部