码迷,mamicode.com
首页 > 其他好文 > 详细

DS之顺序栈和链队实现回文判断

时间:2015-04-17 22:25:05      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:      typedef   struct   结构   

        顺序栈和链队的基本操作就不再一一列举了,要想实现回文判断,先来了解什么是回文?“回文”一字符串正着读和反着读是相同的字符序列,如“abcba”,"abba"为"回文",“abab”则不是“回文”。

        其次就是顺序栈和链队如何实现回文的判断?将输入的字符串依次入栈和入队,然后再依次出栈和出队,由于入栈和入队是相同的序列,然而出栈和出队是相反的序列,这就实现了回文的判断。

        最后考虑要用到顺序栈和链队的什么基本操作?需要用到栈的基本操作为;1构造一个空栈,2判断栈是否为空,7出栈,8进栈。需要用到链队的基本操作为:1初始化链队,7出队,8入队。

        实现判断回文的函数代码为:

<span style="font-size:18px;">Status huiwen(SqStack &S,LinkQueue &Q)//判断回文的函数
{
	char a,b,c;
	c=getchar();//接受输入的字符串
     while(c!='@')
     { 
		Push(S,c);     
		EnQueue(Q,c);
		c=getchar();
	}
     while(!StackEmpty(S))
    { 
	   Pop(S,a);     
	   DeQueue(Q,b);
    }
    if(a!=b) 
    {
	   return ERROW;
    }
    else
    {
       return OK;
    }
} </span>

       在主函数中只需构建一个顺序栈和链队,再定义一个接受输入的字符串,基本上就实现了回文的判断,输入一个以“@”结束的字符串,回文判断的代码为:

<span style="font-size:18px;">#include <iostream>
using namespace std;
//两个C语言的头文件库
#include <malloc.h>
#include <stdlib.h>
//以下是宏定义
#define OK 1
#define ERROW 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
//以下是类型重新定义
typedef char SElemType;//重新定义SElemType为int型
typedef int Status;//重新定义Status为int型
typedef char QElemType;//重新定义QElemType为int型
//下面的是栈的定义和基本操作
typedef struct{//重新定义SqStck为结构类型
	SElemType *base;//栈底指针
	SElemType *top;//栈顶指针
	int stacksize;//栈的当前可使用的最大容量
}SqStack;
typedef struct QNode{//重新定义一个结点结构
    QElemType   data;
    struct QNode  *next;
}QNode, *QueuePtr;

typedef struct {//定义的一个链队
    QueuePtr  front;//队头指针   
    QueuePtr  rear;//队尾指针
}LinkQueue;//定义的一个结构变量 
//1初始化队列
Status InitQueue(LinkQueue &Q)
{
    Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); 
    if(!Q.front)
	{
		exit(OVERFLOW);
	}
    Q.front->next=NULL;
    return OK;
}
//入队列
Status EnQueue(LinkQueue &Q,QElemType e)
{
    QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
    if(!p) 
	{
		exit(OVERFLOW);
	}
    p->data=e; 
	p->next=NULL;
    Q.rear->next=p;
    Q.rear=p;
    return OK; 
}
//出队列
Status DeQueue(LinkQueue &Q,QElemType &e)
{
   if(Q.front==Q.rear) 
   {
	   return ERROW;
   }
   QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
   p=Q.front->next;
   e=p->data;
   Q.front->next=p->next;
   if(Q.rear==p) 
   {
	   Q.rear=Q.front;
   }
   free(p);
   return OK;
}
//1构造一个空栈
Status InitStack(SqStack &S)
{
	S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
	if(!S.base)
	{
		exit(OVERFLOW);//存储分配失败
	}
	S.top=S.base;
	S.stacksize=STACK_INIT_SIZE;
	return OK;
}
//2判断栈是否为空
Status StackEmpty(SqStack S)
{
	if(S.base==S.top)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}
//7出栈
Status Pop(SqStack &S,SElemType &e)
{
	if(S.top==S.base)
	{
		return ERROW;
	}
	e=*--S.top;
	return OK;
}
//8进栈
Status Push(SqStack &S,SElemType e)
{
	if(S.top-S.base>=S.stacksize)
	{
		//栈满追加存储空间
		SElemType *newbase=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
     if(!newbase)
	{
		exit(OVERFLOW);
	}
		S.base=newbase;
		S.top=S.base+S.stacksize;
		S.stacksize+=STACKINCREMENT;
	}
	*S.top++=e;
	return OK;
}
Status huiwen(SqStack &S,LinkQueue &Q) 
{
	char a,b,c;
	c=getchar();//接受输入的字符串
    while(c!='@')
    { 
		Push(S,c);     
		EnQueue(Q,c);
		c=getchar();
	}
   while(!StackEmpty(S))
   { 
	   Pop(S,a);     
	   DeQueue(Q,b);
   }
   if(a!=b) 
   {
	   return ERROW;
   }
   else
   {
       return OK;
   }
} 
int main()
{
    SqStack s;//
    LinkQueue q;
	InitStack(s);
    InitQueue(q);
	char *array1=new char[100];
	cout<<"输入你所要验证的字符串:";
	if(huiwen(s,q))
	{
		cout<<"这是回文";
	}
	else
	{
		cout<<"这不是回文";
	}
	return 0;
}</span>

         输入的字符串为:abcba@

         输出的结果为:

技术分享

 

         输入的字符串为:abcde@

         输出的结果为:

技术分享

 

 

 


 

 


 


 

DS之顺序栈和链队实现回文判断

标签:      typedef   struct   结构   

原文地址:http://blog.csdn.net/erlian1992/article/details/45100613

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!