类C语言--栈与队列习题:回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈)

此代码可以正常运行,下附有运行界面,是是实实在在的类C语言
将字符串前一半入栈,然后,栈中元素和字符串后一半进行比较。即将第一个出栈元素和后一半串中第一个字符比较,若相等,则再出栈一个元素与后一个字符比较,……,直至栈空,结论为字符序列是回文。在出栈元素与串中字符比较不等时,结论字符序列不是回文。

#include 
#include 
#include
typedef char ElemType;
typedef struct
{
	int stack_size;
	ElemType *top;
	ElemType *base;
}Stack;
enum Status{ERROR,OK};

InitStack(Stack &S,ElemType *t)  //初始化栈
{
	int len=strlen(t);
	S.base = (ElemType *)malloc(len * sizeof(ElemType));
	if (S.base == NULL)
		return ERROR;
	S.top = S.base;
	S.stack_size = len;
}

//入栈
Status Push(Stack &S,ElemType e)
{
	if(S.top-S.base==S.stack_size)
		return ERROR;
	*S.top++=e;
	return OK;
}

//出栈
Status Pop(Stack &S,ElemType &e)
{
	if(S.top==S.base)
		return ERROR;
	e=*--S.top;
	return OK;
}

//判空
int StackEmpty(Stack S)
{
	return (S.top==S.base);
}

Status IsPlalindrome(ElemType *t) //判断t[]是否为回文
{
  Stack S;
  ElemType e;
  int i , len;
  InitStack(S,t);
  len=strlen(t); //求数组长度
  for ( i=0; i<len/2; i++)//将一半字符入栈
    Push(S, t[i]);
  if(strlen(t)%2==1)
		i++;
  while( !StackEmpty(S))// 每弹出一个字符与相应字符比较
  {
    Pop (S,e);

    if( e!=t[i])
		return ERROR ;// 不等则返回0
    else  i++;
  }
  return OK ; // 比较完毕均相等
}

int main()
{
	int len=0;
	ElemType *a=NULL;
	printf("你要输入几个字符:");
	scanf("%d", &len);
	getchar();  //吃掉回车
	a = (ElemType *)malloc(len * sizeof(ElemType));
	printf("\n请输入待检测的字符串:");
	gets(a);

	if (IsPlalindrome(a))
		printf("\n是回文字符串!");
	else
		printf("\n不是回文字符串!");
	return 0;
}

你可能感兴趣的:(栈,字符串,栈,c语言)