湖北工业大学:《数据结构》第3章 堆栈和队列(3/3)

五、链式队列 1、链式队列采用链式存储结构的队列。 2、链式队列的存储结构 链式队列的队头指针指在队列的当前队头结点 位置,队尾指针指在队列的当前队尾结点位置。 下图是一个不带头结点的链式队列的结构:rear head a o a1
1 五、链式队列 1、链式队列 采用链式存储结构的队列。 2、链式队列的存储结构 链式队列的队头指针指在队列的当前队头结点 位置,队尾指针指在队列的当前队尾结点位置。 下图是一个不带头结点的链式队列的结构:rear head a0 a1 a /\ …… n-1

链式队列中结点的结构体定义为: typedef struct gnode DataType data struct gnode * next LQNode 为了方便参数调用,通常把链式队列的队头指针 fron和队尾指针rear也定义为结构体类型,如下: typedef struct LQNode *front LQNode krear 3 Queue
2 链式队列中结点的结构体定义为: typedef struct qnode { DataType data; struct qnode *next; }LQNode; 为了方便参数调用,通常把链式队列的队头指针 front和队尾指针rear也定义为结构体类型,如下: typedef struct { LQNode *front; LQNode *rear; }Lqueue;

3、链式队列操作的实现 (1)入链队列 算法说明:向链队列的队尾插入一个元素 分析: 1)申请一个链结点 p=( LQNode *)malloc(sizeof ( LQNode)) p->data= x: p->next= NULL 2)插入动作 if( Q->rear != NULL)Q->rear->next=p; Q->rear=p if(Q->front==NULLQ->front=p; 入链队列的完整算法如下:
3 3、链式队列操作的实现 (1)入链队列 算法说明:向链队列的队尾插入一个元素 分 析: 1)申请一个链结点 p=(LQNode *)malloc(sizeof(LQNode)); p->data = x; p->next = NULL; 2)插入动作 if(Q->rear != NULL) Q->rear->next = p; Q->rear = p; if(Q->front == NULL) Q->front = p; 入链队列的完整算法如下:

int QueueAppend LQueue *Q, DataType x) t LQnode *p if((p=(lQnode *)malloc(sizeof(LQNode)))==NUlL) printf("内存空间不足!" return U: p->data =X p->next= NULL f( Q->rear NULL)Q->rear->next =p Q->rear=p if( Q->front = NULL)Q->front=p return 1
4 int QueueAppend(LQueue *Q, DataType x) { LQNode *p; if((p = (LQNode *)malloc(sizeof(LQNode))) == NULL) { printf("内存空间不足!"); return 0; } p->data = x; p->next = NULL; if(Q->rear != NULL) Q->rear->next = p; Q->rear = p; if(Q->front == NULL) Q->front = p; return 1; }

(2)出链队列 算法说明:删除链队列的队头元素。 分析: (1)在删除前应当判断链队列是否空? if(Q->front==NULL) return 0; (2)删除动作 * d=Q->front->data p=Q->front; Q->front=Q->front->next if( Q->front== NULL Q->rear= NULL;
5 (2)出链队列 算法说明:删除链队列的队头元素。 分 析: (1) 在删除前应当判断链队列是否空? if(Q->front == NULL) return 0; (2)删除动作 *d = Q->front->data; p = Q->front; Q->front = Q->front->next; if(Q->front == NULL) Q->rear = NULL;

出链队列的完整算法如下: int Queue Delete(LQueue *Q, Data Type*d) LQNode *p: if(Q->front = NULL) { printf("队列已空无数据元素出队列!n"; return o;} else *d=Q->front->data; p=Q->front; Q->front =Q->front->next if(Q->front = NULL)Q->rear NULL; free(p); return 1; J
6 出链队列的完整算法如下: int QueueDelete(LQueue *Q, DataType *d) { LQNode *p; if(Q->front == NULL) { printf("队列已空无数据元素出队列! \n");return 0;} else { *d = Q->front->data; p = Q->front; Q->front = Q->front->next; if(Q->front == NULL) Q->rear = NULL; free(p); return 1; } }

六、队列的应用 例:编程序判断一个字符序列是否是回文 编程思想: 设字符数组str中存放了要判断的字符串 把字符数组中的字符逐个分别存入队列和堆 栈,然后逐个出队列和退栈并比较出队列的 字符和退栈的字符是否相等,若全部相等则 该字符序列是回文,否则就不是回文
7 六、队列的应用 例:编程序判断一个字符序列是否是回文。 编程思想: 设字符数组str中存放了要判断的字符串。 把字符数组中的字符逐个分别存入队列和堆 栈,然后逐个出队列和退栈并比较出队列的 字符和退栈的字符是否相等,若全部相等则 该字符序列是回文,否则就不是回文

#include #include <string. h #define MaxQueueSize 100 #define maxStackSize 100 typedef char dataType #include SegCQueue h #include SeqStack h" void Hui Wen(char strl t Seq CQueue myQueue Seqstack myStack char x, y; int i, length;
8 #include #include #define MaxQueueSize 100 #define MaxStackSize 100 typedef char DataType; #include "SeqCQueue.h" #include "SeqStack.h“ void HuiWen(char str[]) { SeqCQueue myQueue; SeqStack myStack; char x, y; int i, length;

ength= strlen(str方h QueueInitiate(&my Queue); StackInitiate(&myStack); for(i=0; i length; i++) Queue Append ( &my Queue, str[D); StackPush(&myStack, str[); while(Queue NotEmpty(my Queue)==1&& StackNotEmpty(my Stack)==l)t if(Queue Delete (&my Queue, &x)==1 & Stack Pop(&my Stack, &y)==1&&x= y) printf(("‰%s不是回文Nn",str); return: 1
9 length = strlen(str); QueueInitiate(&myQueue); StackInitiate(&myStack); for(i = 0; i < length; i++) { QueueAppend(&myQueue, str[i]); StackPush(&myStack, str[i]); } while(QueueNotEmpty(myQueue)==1 && StackNotEmpty(myStack)==1){ if(QueueDelete(&myQueue, &x) == 1 && StackPop(&myStack, &y) == 1 && x != y) { printf("%s不是回文!\n", str); return; } }

if(Queue NotEmpty(myQueue)lI StackNotEmpty(my Stack)) printf(("%s不是回文!n",str); else printf("‰%s是回文!n",str) void main(void) char str1[]="ABCDEDCBA char str2[]="ABCDEDCAB HuiWen(strI) HuiWen(str2);
10 if(QueueNotEmpty(myQueue) || StackNotEmpty(myStack)) printf("%s不是回文!\n", str); else printf("%s是回文!\n", str); } void main(void) { char str1[] = "ABCDEDCBA"; char str2[] = "ABCDEDCAB"; HuiWen(str1); HuiWen(str2); }
按次数下载不扣除下载券;
注册用户24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
- 湖北工业大学:《数据结构》第3章 堆栈和队列(2/3).ppt
- 湖北工业大学:《数据结构》第3章 堆栈和队列(1/3).ppt
- 湖北工业大学:《数据结构》第2章 线性表(4/4).ppt
- 湖北工业大学:《数据结构》第2章 线性表(3/4).ppt
- 湖北工业大学:《数据结构》第2章 线性表(2/4).ppt
- 湖北工业大学:《数据结构》第2章 线性表(1/4).ppt
- 湖北工业大学:《数据结构》前言、第1章 绪论.ppt
- 湖北工业大学:《数据结构》第9章(9-2)哈希查找表.ppt
- 湖北工业大学:《数据结构》第10章(10-1)查找的基本概念.ppt
- 《ASP程序设计》课程配套PPT教学课件(共十一章).ppt
- 《数字平面艺术设计》课程教学资源(教材PPT课件,图片版)第2章 平面设计概述.ppt
- 北京大学:《组件技术》课程教学资源(讲义课件)第十三讲 软件设计模式(二).pdf
- 北京大学:《组件技术》课程教学资源(讲义课件)第十二讲 软件设计模式(一).pdf
- 北京大学:《组件技术》课程教学资源(讲义课件)第十一讲 COM+.pdf
- 北京大学:《组件技术》课程教学资源(讲义课件)第十讲 COM:moniker、UT、control.pdf
- 北京大学:《组件技术》课程教学资源(讲义课件)第九讲 COM:可连接对象&结构化存储.pdf
- 北京大学:《组件技术》课程教学资源(讲义课件)第八讲 COM开发.pdf
- 北京大学:《组件技术》课程教学资源(讲义课件)第七讲 自动化 Automation.pdf
- 北京大学:《组件技术》课程教学资源(讲义课件)第六讲 COM多线程模型、DCOM.pdf
- 北京大学:《组件技术》课程教学资源(讲义课件)第五讲 COM特性.pdf
- 湖北工业大学:《数据结构》第4章 串(String)(1/2).ppt
- 湖北工业大学:《数据结构》第4章 串(String)(2/2).ppt
- 湖北工业大学:《数据结构》第5章 数组.ppt
- 湖北工业大学:《数据结构》第6章 递归.ppt
- 湖北工业大学:《数据结构》第7章 树和二叉树(Tree & Binary Tree)(1/5).ppt
- 湖北工业大学:《数据结构》第7章 树和二叉树(Tree & Binary Tree)(2/5).ppt
- 湖北工业大学:《数据结构》第7章 树和二叉树(Tree & Binary Tree)(3/5).ppt
- 湖北工业大学:《数据结构》第7章 树和二叉树(Tree & Binary Tree)(4/5).ppt
- 湖北工业大学:《数据结构》第7章 树和二叉树(Tree & Binary Tree)(5/5).ppt
- 湖北工业大学:《数据结构》第8章 图(1/2).ppt
- 湖北工业大学:《数据结构》第8章 图(2/2).ppt
- 湖北工业大学:《数据结构》第9章 排序(1/2).ppt
- 湖北工业大学:《数据结构》第9章 排序(2/2).ppt
- 中国矿业大学:密码学_authentication protocol.ppt
- 中国矿业大学:密码学_Block ciphers-AES(Advanced Encryption Standard).ppt
- 中国矿业大学:密码学_Block ciphers-DES(DATA ENCRYPTION STANDARD).ppt
- 中国矿业大学:密码学_Block ciphers-L&D(Linear and Differential Cryptanalysis).ppt
- 中国矿业大学:密码学_CRYPTO12(Number Theory).ppt
- 中国矿业大学:密码学_Digital Signature.ppt
- 中国矿业大学:密码学_Hash Functions.ppt