您的位置:首页 > 理论基础 > 数据结构算法

严蔚敏数据结构习题3.31

2015-10-08 19:26 381 查看
3.31 假设称正读和反读都相同的字符序列为“回文”,例如,‘abba’和‘abcba’是回文,‘abcde’和‘ababab’则不是回文。试写一个算法判别读入的一个以‘@’为结束符的字符序列是否是“回文”。

这题非常简单,分别入栈和入队,然后出栈和出队列比较,相同即可。这种思路我也是灵光一闪想到的。本以为能沾沾自喜,网上搜了一下基本都是这样,orz,只能感叹一句:我是一只小菜鸟~~

因为很简单,所以注释就不怎么打了,基本一眼就能看懂的

#include <stdio.h>
#include <stdlib.h>
#define initsize 100
#define addsize 10

typedef struct
{
char *base;
int top,stacksize;
}sqstack;

int init_stack(sqstack &s)
{
s.base=(char*)malloc(initsize*sizeof(char));
if(!s.base)exit(-1);
s.top=0;
s.stacksize=initsize;
return 1;
}

int push(sqstack &s,char e)
{
char *newbase;
if(s.top==s.stacksize)
{
newbase=(char*)realloc(s.base,(s.stacksize+addsize)*sizeof(char));
s.base=newbase;
s.stacksize+=addsize;
}
s.base[s.top++]=e;
return 1;
}
int pop(sqstack &s,char &e)
{
if(!s.top)return 0;
e=s.base[--s.top];
return 1;
}

int stackempty(sqstack s)
{
return !s.top;
}

typedef struct
{
char data[initsize];
int rear,head;

}sqqunue;

void init_qunue(sqqunue &q)
{
q.rear=q.head=0;
}

int ensqunue(sqqunue &q,char e)
{
if ((q.rear + 1) % initsize == q.head)
{
return 0;
}
q.data[q.rear] = e;
q.rear = (q.rear + 1) % initsize;
return 1;
}

int delsqunue(sqqunue &q,char &e)
{
if(q.head==q.rear)return 0;
e=q.data[q.head];
q.head=(q.head+1)%initsize;
return 1;

}

int sanshiyi(char *p)
{
sqqunue q;
sqstack s;
char e1,e2;
init_qunue(q);
init_stack(s);
while(*p)
{
push(s,*p);
ensqunue(q,*p);
p++;
}
while(!stackempty(s))
{
pop(s,e1);
delsqunue(q,e2);
if(e1!=e2)return 0;
}
return 1;
}

int main()
{
char p[100];
int k;
gets(p);
k=sanshiyi(p);
if(k==1)printf("YES");
else printf("NO");
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息