【问题描述】
回文,即首尾对称的字符串。现在判断输入的字符串是否是回文,如果是,输出“yes”,如果不是,输出”no”。
要求:基于ADT实现,使用单链表存储输入的字符串。
【输入形式】
单行输入由数字及字符组成的字符串,字符串长度不大于1000。
【输出形式】
输出yes表示是回文,输出no表示不是回文。
【样例输入】
sdsfegrhglp
【样例输出】
no
【样例说明】
sdsfegrhglp不是回文,输出no。
【样例输入】
helloolleh
【样例输出】
yes
【样例说明】
helloolleh是回文,输出yes。
【样例输入】
asas232sasa
【样例输出】
yes
【样例说明】
asas232sasa是回文,输出yes。
【代码提交及评分要求】
源代码请提交工程压缩包,压缩包内至少包含以下三个文件:
1)XXX.h:线性表ADT的定义和声明
2)XXX.h:线性表ADT的实现
3)XXXXX.
//虚函数建立,链式线性表的建立
#ifndef LIST_H_
#define LIST_H_
template<typename E>
class Link
{
public:
E element;
Link<E> *next;
Link(const E& elemval,Link<E> *nextval=NULL)
{
element=elemval;
next=nextval;
}
Link(Link<E>* nextval=NULL)
{
next=nextval;
}
};
template<typename E>
class List
{
private:
void operator =(const List&) {}
public:
List(){};
virtual ~List(){};
virtual void insert(const E& it) =0;
virtual void append(const E& it) =0;
virtual E remove()=0;
virtual void moveTostart() =0;
virtual void moveToend() =0;
virtual void pre() =0;
virtual void next() =0;
virtual int length() =0;
virtual int currPos() =0;
virtual void moveTopos(int pos) =0;
virtual const E& getValue() =0;
};
#endif
//具体实现虚函数
#ifndef LLIST_H_
#define LLIST_H_
#include"List.h"
#include<iostream>
using namespace std;
void Assert(bool val,string s)
{
if(!val)
cout<<s<<endl;
return ;
}
template<typename E>
class LList:public List<E>
{
private:
Link<E> *head;
Link<E> *tail;
Link<E> *curr;
int cnt;
void init()
{
head=tail=curr=new Link<E>;
cnt=0;
}
void removeall()
{
while(cnt--)
{
curr=head;
head=head->next;
delete curr;
}
cnt=0;
}
public:
LList()
{
init();
}
~LList()
{
removeall();
}
void print()
{
curr=head->next;
while(curr!=tail)
{
cout<<curr->element<<" ";
curr=curr->next;
}
cout<<endl;
}
void clear()
{
removeall();
init();
}
void insert(const E& it)
{
curr->next=new Link<E>(it,curr->next);
if(tail=curr) tail=tail->next;
cnt++;
}
void append(const E& it)
{
tail=tail->next=new Link<E>(it,NULL);
cnt++;
}
E remove()
{
Assert(curr->next != NULL, "No element");
Link<E> *temp=curr->next;
E item=temp->element;
if(tail==temp) tail=tail->next;
curr->next=temp->next;
delete temp;
cnt--;
return item;
}
void moveTostart()
{
curr=head;
}
void moveToend()
{
curr=tail;
}
void pre()
{
if(curr==head) return ;
Link<E> *temp=head;
while(temp->next!=curr)
temp=temp->next;
curr=temp;
}
void next()
{
curr=curr->next;
}
int length()
{
return cnt;
}
int currPos()
{
int cnt2=0;
Link<E> *temp=head;
while(temp!=curr)
{
temp=temp->next;
cnt2++;
}
return cnt2;
}
void moveTopos(int pos)
{
Assert((pos>=0)&&(pos<=cnt),"Position is wrong!");
curr=head;
while(pos--)
curr=curr->next;
}
const E& getValue()
{
Assert(curr->next!=NULL,"No value!");
return curr->next->element;
}
};
#endif
//主函数
#include <iostream>
#include"List.h"
#include"LList.h"
#include<string>
using namespace std;
int main() {
string L;
LList<char>L1;
cin>>L;
int len=L.length();
for(int i=0;i<len;i++)
{
L1.append(L[i]);
}
if(len%2==0)
{
for(int i=0;i<len/2;i++)
{
char m;
L1.moveTopos(i);
m=L1.getValue();
L1.moveTopos(len-1-i);
if(m!=L1.getValue())
{
cout<<"no"<<endl;
return 0;
}
}
}
else
{
for(int i=0;i<(len+1)/2;i++)
{
char m;
L1.moveTopos(i);
m=L1.getValue();
L1.moveTopos(len-1-i);
if(m!=L1.getValue())
{
cout<<"no"<<endl;
return 0;
}
}
}
cout<<"yes"<<endl;
return 0;
}
cpp:主程序