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

链式队列

时间:2015-07-20 13:07:04      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:链式队列

编程判断一个字符序列是否是回文。回文是指一个字符序列以中间字符为基准两边字符完全相同,即顺着看和倒着看是相同的字符序列。如字符序列“ABCDCBA”就是回文,而字符序列“ABCBCAB”,就不是回文。

#include<stdio.h>//包含输出函数
#include<stdlib.h>//包含退出函数
#include<string.h>//包含字符串长度函数
#include<malloc.h>//包含内存分配函数
typedef char DataType;//类型定义为字符类型
typedef struct snode//链式堆栈结点类型定义
{
	DataType data;
	struct snode *next;
}LSNode;
typedef struct QNode//只有队尾指针的链式循环队列类型定义
{
	DataType data;
	struct QNode *next;
}LQNode,*LinkQueue;
void InitStack(LSNode **head)//带头结点的链式堆栈初始化
{
	if((*head=(LSNode*)malloc(sizeof(LSNode)))==NULL)//为头结点分配空间
	{
		printf("分配结点不成功");
		exit(-1);
	}
    else
		(*head)->next =NULL;//头结点的指针域设置为空
}
int StackEmpty(LSNode *head)//判断带头结点链式堆栈是否为空。如果堆栈为空,返回1,否则返回0
{
	if(head->next == NULL)//如果堆栈为空,返回1,否则返回0
		return 1;
	else 
		return 0;
}
int PushStack(LSNode *head,DataType e)//链式堆栈进栈。进栈成功返回1,否则退出
{
    LSNode *s;
	if((s=(LSNode*)malloc(sizeof(LSNode)))== NULL)//为结点分配空间,失败退出程序并返回-1
		exit(-1);
	else
	{
		s->data =e;//把元素值赋值给结点的数据域
		s->next =head->next ;//将结点插入到栈顶
		head->next =s;
		return 1;
	}
}
int PopStack(LSNode *head,DataType *e)//链式堆栈出栈,需要判断堆栈是否为空。
//出栈成功返回1,否则返回0
{
	LSNode *s=head->next ;//指针s指向栈顶结点
	if(StackEmpty(head))//判断堆栈是否为空
		return 0;
	else
	{
		head->next =s->next ;//头结点的指针指向第二个结点位置
		*e=s->data ;//要出栈的结点元素赋值给e
		free(s);//释放要出栈的结点空间
		return 1;
	}
}
void InitQueue(LinkQueue *rear)//将带头结点的链式循环队列初始化为空队列,需要把头结点的指针指向
//头结点
{
	if((*rear=(LQNode*)malloc(sizeof(LQNode)))==NULL)
		exit(-1);//如果申请结点空间失败则退出
	else
        (*rear)->next =*rear;//队尾指针指向头结点
}
int QueueEmpty(LinkQueue rear)
//判断链式队列是否为空,队列为空返回1,否则返回0
{
	if(rear->next ==rear)//判断队列是否为空。当队列为空时,返回1,否则返回0
		return 1;
	else
	    return 0;
}
int EnQueue(LinkQueue *rear,DataType e)
//将元素e插入到链式队列中,插入成功返回1
{
	LQNode *s;
	s=(LQNode*)malloc(sizeof(LQNode));//为将要入队的元素申请一个结点空间
	if(!s)
		exit(-1);//如果申请空间失败,则退出并返回参数-1
	s->data =e;//将元素值赋值给结点的数据域
	s->next =(*rear)->next ;//将新结点插入链式队列
	(*rear)->next =s;
	*rear=s;//修改队尾指针
	return 1;
}
int DeQueue(LinkQueue *rear,DataType *e)
//删除链式队列中的队头元素,并将该元素赋值给e,删除成功返回1,否则返回0
{
	LQNode *f,*p;
	if(*rear==(*rear)->next)
		//在删除队头元素即出队列之前,判断链式队列是否为空
		return 0;
	else
	{
		f=(*rear)->next ;//使指针f指向头结点
		p=f->next ;//使指针p指向要删除的结点
		if(p==*rear)//处理队列中只有一个结点的情况
		{
			*rear=(*rear)->next ;//使指针rear指向头结点
			(*rear)->next =*rear;
		}
		else
			f->next =p->next ;//将头结点指向要出队列的下一个结点
		*e=p->data ;//把队头元素值赋值给e
		free(p);//释放指针p指向的结点
		return 1;
	}
}
void main()
{
	LinkQueue LQueue1,LQueue2;//定义链式循环队列
	LSNode *LStack1,*LStack2;//定义链式堆栈
	char str1[]="ABCDCBA";//回文字符序列1
	char str2[]="ABCBCAB";//回文字符序列2
	char q1,s1,q2,s2;
	int i;
	InitQueue(&LQueue1);
    InitQueue(&LQueue2);
	InitStack(&LStack1);
	InitStack(&LStack2);
	for(i=0;i<strlen(str1);i++)
	{
		EnQueue(&LQueue1,str1[i]);
        EnQueue(&LQueue2,str2[i]);
        PushStack(LStack1,str1[i]);
        PushStack(LStack2,str2[i]);
	}
	printf("字符序列1:\n");
	printf("出队序列  出栈序列\n");
	while(!StackEmpty(LStack1))//判断堆栈1是否为空
	{
		DeQueue(&LQueue1,&q1);//字符序列依次出队,并把出队元素赋值给q
        PopStack(LStack1,&s1);//字符序列出栈,并把出栈元素赋值给s
		printf("%5c",q1);
		printf("%10c\n",s1);
		if(q1!=s1)
		{
			printf("字符序列1不是回文!");
			return;
		}
	}
	printf("字符序列1是回文!\n");
	printf("字符序列2:\n");
    printf("出队序列  出栈序列\n");
	while(!StackEmpty(LStack2))//判断堆栈2是否为空
	{
		DeQueue(&LQueue2,&q2);//字符序列依次出队,并把出队元素赋值给q
        PopStack(LStack2,&s2);//字符序列出栈,并把出栈元素赋值给s
		printf("%5c",q2);
		printf("%10c\n",s2);
		if(q2!=s2)
		{
			printf("字符序列2不是回文!\n");
			return;
		}
	}
	printf("字符序列2是回文!\n");
}
技术分享

版权声明:本文为博主原创文章,未经博主允许不得转载。

链式队列

标签:链式队列

原文地址:http://blog.csdn.net/weichanjuan3/article/details/46965043

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