队列的链式结构
2015-10-20 10:34
218 查看
队列的链式结构
队列的链式存储结构,其实就是线性表的单链表,只是只能够尾进头出而已。为了操作的方便,我们将队头指针指向链队列的头结点,队尾指针指向终点结点,如下图所示。
空队列是,front和rear同时指向头结点。链式队列基本没有满队列。
链式队列的类型定义:
二:链式队列的实现
LinkQueue.c文件
LinkQueue.h文件
3:main.c文件
结果显示:
队列的链式存储结构,其实就是线性表的单链表,只是只能够尾进头出而已。为了操作的方便,我们将队头指针指向链队列的头结点,队尾指针指向终点结点,如下图所示。
空队列是,front和rear同时指向头结点。链式队列基本没有满队列。
链式队列的类型定义:
<span style="font-size:14px;">typedef struct QNode { Datatype data; struct QNode *next; }LQNode, *QueuePtr; //链式队列的定义 typedef struct { QueuePtr front, rear; }LinkQueue;</span>
二:链式队列的实现
LinkQueue.c文件
#include "LinkQueue.h" #include <stdio.h> //初始化链式队列 void InitQueue(LinkQueue *LQ) { LQ->front = LQ->rear = (LQNode *)malloc(sizeof(LQNode)); //创建头结点= 尾结点 if(LQ->front == NULL) //创建失败 exit(-1); LQ->front->next = NULL; //把头结点的指针域设为NULL } //判断链式队列是够为空 int QueueEmpty(LinkQueue LQ) { if(LQ.front->next == NULL) //判断头结点的指针域是否NULL return 1; else return 0; } //入队操作 int EnterQueue(LinkQueue *LQ, DataType e) { LQNode *s; s = (LQNode *)malloc(sizeof(LQNode)); //为入队的元素申请一个结点 if(!s) exit(-1); s->data = e; //将元素值赋值给结点的数据域 s->next = NULL; //将结点的指针域为NULL LQ->rear->next = s; //将原来队列的队尾指针指向s LQ->rear = s; //将尾指针指向s return 1; } //出队操作 int DeleteQueue(LinkQueue *LQ,DataType *e) { LQNode *p; if(LQ->front == LQ->rear) //判断队列为空 return 0; else p = LQ->front->next; *e = p->data; //*e为将要删除的数值 LQ->front->next = p->next; //将对原结点的next指向后一个结点 if(LQ->rear == p) //如果队头是队尾 LQ->rear = LQ->front; free(p); return 1; } //取队头元素 int GetHead(LinkQueue LQ,DataType *e) { if(LQ.front == LQ.rear) //判断是否为空队列 return 0; else *e = LQ.front->next->data; //取队头元素 return 1; } //求队长操作 int QueueLength(LinkQueue LQ) { LQNode *p; int count = 0; p = LQ.front; //p指向栈顶指针 while(p->next != NULL) //判断栈是否还有结点<pre name="code" class="cpp">}
LinkQueue.h文件
#ifndef _LINKQUEUE_H #define _LINKQUEUE_H typedef char DataType; //链式队列结点定义 typedef struct QNode { DataType data; struct QNode *next; }LQNode,*QueuePtr; //定义队列类型 typedef struct { QueuePtr front,rear; }LinkQueue; //初始化链式队列 void InitQueue(LinkQueue *LQ); //判断链式队列是够为空 int QueueEmpty(LinkQueue LQ); //入队操作 int EnterQueue(LinkQueue *LQ, DataType e); //出队操作 int DeleteQueue(LinkQueue *LQ,DataType *e); //取队头元素 int GetHead(LinkQueue LQ,DataType *e); //求队长操作 int QueueLength(LinkQueue LQ); //清空队列 void ClearQueue(LinkQueue *LQ); #endif
3:main.c文件
<strong>/*判断字符序列事是否为回文,采用队列和栈的方法,队列是先进先出,栈是先进后出 若出队的和出栈的元素一致,则是回文*/ #include <stdio.h> #include "LinkQueue.h" #include "LinkStack.h" void main() { LinkQueue LQueue1,LQueue2; //定义链式队列 LStackNode *LStack1,*LStack2; //定义链式栈 char str1[] = "XYZAZYX"; //需要判断的字符串 char str2[] = "XYHJHAA"; char q1,s1,q2,s2; int i; InitQueue(&LQueue1); //初始化链式队列和栈 InitQueue(&LQueue2); InitStack(&LStack1); InitStack(&LStack2); for(i = 0; i<strlen(str1); i++) { EnterQueue(&LQueue1,str1[i]); //依次将字符序列1入队 EnterQueue(&LQueue2,str2[i]); //依次将字符序列2入队 PushStack(LStack1,str1[i]); //依次将字符序列1进栈 PushStack(LStack2,str2[i]); //依次将字符序列2进栈 } printf("字符序列1:\n"); printf("出队序列 出栈序列\n"); while(!StackEmpty(LStack1)) //判断字符序列是否全出栈 { DeleteQueue(&LQueue1,&q1); //队列出队 PopStack(LStack1,&s1); //出栈 printf("%5c",q1); printf("%10c\n",s1); if(q1 != s1) //比较出列的元素是否和出栈的元素一值 { printf("字符序列1不是回文:\n"); break; } if(StackEmpty(LStack1)) //判断字符序列是否全出栈 printf("字符序列1是回文:\n"); } printf("字符序列2:\n"); printf("出队序列 出栈序列\n"); while(!StackEmpty(LStack2)) //判断字符序列是否全出栈 { DeleteQueue(&LQueue2,&q2); PopStack(LStack2,&s2); printf("%5c",q2); printf("%10c\n",s2); if(q2 != s2) //比较出列的元素是否和出栈的元素一值 { printf("字符序列2不是回文:\n"); break; } if(StackEmpty(LStack2)) printf("字符序列2是回文:\n"); } }</strong>
结果显示:
相关文章推荐
- C#线程队列用法实例分析
- 算法系列15天速成 第九天 队列
- C语言单链队列的表示与实现实例详解
- mysql 队列 实现并发读
- C#队列Queue用法实例分析
- C#多线程处理多个队列数据的方法
- C语言循环队列的表示与实现实例详解
- C++循环队列实现模型
- C#内置队列类Queue用法实例
- Array栈方法和队列方法的特点说明
- C#通过链表实现队列的方法
- java线性表排序示例分享
- C#队列Queue多线程用法实例
- C#数据结构与算法揭秘五 栈和队列
- C++中队列的建立与操作详细解析
- PHP实现的memcache环形队列类实例
- php基于双向循环队列实现历史记录的前进后退等功能
- 队列在编程中的实际应用(php)
- php线性表的入栈与出栈实例分析
- C++语言实现线性表之数组实例