- 1、本文档共14页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章作业 栈与队列
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++)
文档评论(0)