设为首页 加入收藏

TOP

DS之顺序栈和链队实现回文判断(一)
2015-07-24 10:44:30 来源: 作者: 【 】 浏览:3
Tags:顺序 实现 判断

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

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

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

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

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;
    }
} 

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

#include 
using namespace std;
//两个C语言的头文件库
#include 
#include 
//以下是宏定义
#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;
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇BIEE11gBI_serverJvm参数调整 下一篇Navicat导入TXT到数据库

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++ Lambda表达式保 (2025-12-26 05:49:45)
·C++ Lambda表达式的 (2025-12-26 05:49:42)
·深入浅出 C++ Lambda (2025-12-26 05:49:40)
·C语言指针从入门到基 (2025-12-26 05:21:36)
·【C语言指针初阶】C (2025-12-26 05:21:33)