数据结构C语言描述———用顺序队列判断回文数

所谓回文数就是正着读跟倒着读一样,比如abcba。用队列判断回文数需要一个栈作为中间量,把一串数字分别进栈和入队,按照栈先进后出和队列先进先出的原则,如果栈顶元素跟队头元素相等,则栈顶元素出栈同时队头元素出队,接着往下比较,知道必到该串数字的长度的一半,如果之前出栈的元素和出队的元素分别一一相等,那么该串数字就是回文数。

如下图所示:

数据结构C语言描述———用顺序队列判断回文数_第1张图片

头文件定义栈和顺序队列的结构体,以及实现栈的基本功能:

#include 
#include 

//队列的结构体定义
typedef int datatype;
#define  maxnum 20

struct SeqQueue{
	datatype f,r;//头跟尾
	datatype q[maxnum];//数组长度
};

typedef struct SeqQueue *PSequeue;//重定义结构体
PSequeue creatEmptyQueue(void);
int isEmptySqueue(PSequeue qu);
void insertQueue(PSequeue qu,datatype x);
void deleteQueue(PSequeue qu);
datatype topQueueElement(PSequeue qu);
int isFullQueue(PSequeue qu);


//栈的结构体定义
typedef int DataType ;
struct node;//定义一个结点
typedef struct node *PNode; //定义结点指针

struct node{
	DataType info;
	PNode next;
};

struct stack{//创建一个栈结构体
	PNode top;//指向栈顶元素
};

typedef struct stack *Pointstack;
Pointstack createEmpty_stack(void);//无返回值
int  ifEmpty_stack(Pointstack Pstack);//传入栈参数
void pushElement_stack(Pointstack pstack,DataType x);
void popElement_stack(Pointstack pstack,DataType x);
DataType ElementStackTop(Pointstack pstack);

//创建一个空栈,返回指向空栈的指针
Pointstack createEmpty_stack(){
	Pointstack Pstack=(Pointstack)malloc(sizeof(struct stack));//为结点申请空间
	if(Pstack!=NULL){
		Pstack->top=NULL;//栈顶赋值为空
	}
	else{
		printf("out of speac");
	}
	return Pstack;
}

//判断栈是否为空
int ifEmpty_stack(Pointstack pstack){
	return  pstack->top==NULL;
}

//往栈中压入一个元素
void pushElement_stack(Pointstack pstack,DataType x){
	PNode Snode=(PNode)malloc(sizeof(struct node));//申请一个新的结点空间
	if (Snode==NULL)
	{
		printf("out of speac");
	} 
	else
	{
		Snode->info=x;
		Snode->next=pstack->top;
		pstack->top=Snode;
	}
}

//出栈。即删除一个元素
void popElement_stack(Pointstack pstack){
	if (ifEmpty_stack(pstack))//判断栈是否已空
	{
		printf("out of speac");
	} 
	else
	{
		PNode p=pstack->top;//为什么非得定义一个新结点来替代栈顶元素?
		pstack->top=pstack->top->next;
		free(p);
	}

}

//求栈顶元素
DataType ElementStackTop(Pointstack pstack){
	if (ifEmpty_stack(pstack))
	{
		printf("stack is empty");
	} 
	else
	{
		return pstack->top->info;
	}
}


源文件主函数以及实现顺序队列基本功能:

#include "queue.h"

typedef int datatype;
#define  maxnum 20

struct SeqQueue{
	datatype f,r;//头跟尾
	datatype q[maxnum];//数组长度
};

typedef struct SeqQueue *PSequeue;//重定义结构体
//创建空队列
PSequeue creatEmptyQueue(void){
	PSequeue qu=(PSequeue)malloc(sizeof(struct SeqQueue));//顺序队列所指的是对应的元素的位置下标,不是值
	if (qu==NULL)
	{
		printf("out of space");
	} 
	else
	{
		qu->f=qu->r=0;
		return qu;
	}
}


//判断队列是否为空
int isEmptySqueue(PSequeue qu){
	return qu->f==qu->r;//队尾=队头,则队列为空
}

//在队列中插入某一个元素
void insertQueue(PSequeue qu,datatype x){
	//首先判断队列是否已满
	if ((qu->r+1)%maxnum==qu->f)
	{
		printf("full queue");
	} 
	else
	{    //尾进头出
		qu->q[qu->r]=x;//x插入当前队尾所指的位置
		qu->r=(qu->r+1)%maxnum;//循环队列的长度加一
	}
}

//返回队列元素的个数
int queuenumber(PSequeue qu){
	int count=0;
	if (isEmptySqueue(qu))
	{
		printf("queue is empty");
	} 
	else{
		count=qu->r;
	}
	return count;
}


//删除队列头部元素
void deleteQueue(PSequeue qu){
	//首先判断队列是否已空
	if (isEmptySqueue(qu))
	{
		printf("queue is empty");
	} 
	else
	{
		qu->f=qu->f+1;//使队头的下一个结点成为队头,那么当前的队头就出队了
	}
}

//对于非空队列,求队头元素
datatype topQueueElement(PSequeue qu){
	return qu->q[qu->f];//返回队头指向的当前元素
}

//判断队列是否已满
int isFullQueue(PSequeue qu){
	return (qu->r+1)%maxnum==qu->f;//队尾加一等于队头,则满
}



//主函数
void main(){
	PSequeue queue=creatEmptyQueue();
	Pointstack newstack=createEmpty_stack();
	char letter;
	int count=0,i;
	printf("input string:\n");
	scanf("%c",&letter);
	while(letter!='\n'){
		insertQueue(queue,letter);//入队
		pushElement_stack(newstack,letter);//进栈
		scanf("%c",&letter);
		count++;
	}

	for (i=0;i<(count/2);i++)
	{
		if (ElementStackTop(newstack)==topQueueElement(queue))
		{
			printf("是回文数\n");
			break;
		} 
		else
		{
			printf("不是回文数\n");
			break;
		}
	}
}





你可能感兴趣的:(数据结构)