HNU利用单链表判断回文

【问题描述】

回文,即首尾对称的字符串。现在判断输入的字符串是否是回文,如果是,输出“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:主程序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值