<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><span lang="EN-US">5.3.3</span></chsdate> 链式队列实例
下面通过一个实例来说明链式队列的具体使用。
例5_3 编程判断一个字符序列是否是回文。回文是指一个字符序列以中间字符为基准两边字符完全相同,即顺着看和倒着看是相同的字符序列。如字符序列“XYZAZYX”就是回文,而字符序列"XYZBZXY"就不是回文。
分析:考察栈的“先进后出”和队列的“先进先出”的特点,可以通过构造栈和队列实现。可以把字符序列分别存入队列和堆栈,然后依次把字符逐个出队列和出栈,比较出队列的字符和出栈的字符是否相等,如果全部相等则该字符序列是回文,否则不是回文。
我们在这里采用链式堆栈和只有队尾指针的链式循环队列实现,实现代码如下。
#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 EnterQueue(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 DeleteQueue(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;
分享到:
相关推荐
修改代码的艺术>>中文版样张 试读
imageXpert OCR 打印机测试样张 有PDF和Excel格式 符合国际标准的、最权威的打印机测试样张!
《完美测试》样张——软件测试系列最佳实战,测试手段,测试方法,将测试上升为一门艺术
字号对照样张,榜数与字号匹配精确无误,印刷非常实用
ImageExpert_600dpi碳粉打印机测试页样张
LQ1600K打印样张.pdf
打印机样张,可用于彩色打印机测试用,矫正颜色和查看是否有成像问题
通过看测试样张 判断激光打印机硒鼓 某个位置好坏、用这个你自己就能判断了
第7章作业素材及样张,使用html5制作简易电子书博文中代码所使用到的的网页素材,来源于中国大学mooc。
5%,15%覆盖率打印样张,大家就清楚为什么厂家说的多少张,实际打印那么少了。
基本囊括所有理工科及社会科学的毕设样张,非常不错。包括格式,段落,以及一定的论文样板,很有参考价值。课以应用各个学校,从大专到本科的毕设。同时,拥有很宽的适用范围
ISO_IEC_24712标准打印测试样张页面5%覆盖率, 里面有5页, 可以分别打印, 用5张标准页包含图文混合内容,并通过不同的覆盖量使每页上每种颜色达到大约5%的平均覆盖率。
计算机交的作业 表格 WORD PPT每一个都有啊
.archWORD作业设计2(样张).docx
在线购物样张
DPC 1255经严格的专色认证,基于最先进的彩色打印技术,其分辨率高达600 x 600 dpi,8位色彩深度,能够输出带有连续色调细节层次的鲜艳色彩。通过独立的前端处理系统,DPC 1255可以对色彩进行精确控制,忠实、精确地...
1积分下 5%覆盖率 ISO/IEC24712 标准样张测试。 没有积分的可以在这里找得到:https://standards.iso.org/iso-iec/
LINUX书稿样张.docx
大纲打印样张.docx