数据结构与算法系列-队列-顺序队列
2013-11-10 22:08
471 查看
定义:
队列:
队列也是一种特殊的线性表,它仅允许在表的一端进行插入,在表的另一端进行删除,允许插入的一端称为队尾(rear),允许删除的一端称为对首(front)。
在队列数据结构中,遵循先入先出原则。因此又把队列称为先进先出表(First In Fist Out,简称FIFO)
比如说 我们坐火车的时候 火车进入隧道,车头先进入隧道,也是先从隧道出来。
队列顺序存储结构称为顺序队列,顺序队列与顺序表一样,用一个一维数组来存放数据元素。在内存中,用一组连续的存储单元顺序存放队列中的元素。
队列为空:
Front=rear=-1'
Front = read
队满:
Rear=MAXLEN -1;
队列的入队与出队。
若存储队列的一位数组中所有位置上都有元素,即尾指针指向一维数组最后,而头指针指向一维数组开头,则队列满。这是不能再向队列中插入元素
但是还有一种情况,尾指针指向一维数组最后,但前面有元素已经出队,这时插入元素,仍会发生溢出,而实际上队列并未满。这称为“假溢出”。为解决这个问题,
需要了解循环队列。
队列:
队列也是一种特殊的线性表,它仅允许在表的一端进行插入,在表的另一端进行删除,允许插入的一端称为队尾(rear),允许删除的一端称为对首(front)。
在队列数据结构中,遵循先入先出原则。因此又把队列称为先进先出表(First In Fist Out,简称FIFO)
比如说 我们坐火车的时候 火车进入隧道,车头先进入隧道,也是先从隧道出来。
队列顺序存储结构称为顺序队列,顺序队列与顺序表一样,用一个一维数组来存放数据元素。在内存中,用一组连续的存储单元顺序存放队列中的元素。
队列为空:
Front=rear=-1'
Front = read
队满:
Rear=MAXLEN -1;
队列的入队与出队。
#include<stdio.h> #define MAXLEN 10 typedef int elementtype; typedef struct{ elementtype element[MAXLEN];/*存放队列元素的数组*/ int front,rear; }SeQueue; SeQueue InitQueue_sq(){/*建立一个空队列Q*/ SeQueue q; q.front = -1; q.rear = -1; return(q); } int GetFront_sq(SeQueue *q,elementtype *x){/*取队头元素 若队列q非空 用*x 返回其元素*/ if(q->front == q->rear) return (0); else{ *x = q->element[(q->front)+1]; return (1); } } int Enqueue_sq(SeQueue *q,elementtype x){/*入栈操作 若队列q未满 将元素x入列*/ if(q->rear == MAXLEN -1) return(0); q->rear++; q->element[q->rear] = x; return(1); } int Delqueue_sq(SeQueue *q,elementtype *x){ if(q->front == q->rear) return(0); else{ q->front++; *x=q->element[q->front]; return(1); } } int Empty_sq(SeQueue *q){ return(q->front == q->rear); } void print(SeQueue q){ int i; if(q.front!=q.rear){ printf("Output elements of queue: "); for(i=q.front+1;i<=q.rear;i++) printf("%d",q.element[i]); }else printf("The queue is empty!"); printf("\n"); } main(){ SeQueue queue; int i; elementtype y; elementtype z; queue = InitQueue_sq(); if(Empty_sq(&queue)!=0) printf("the queue is empty"); else printf("the queue is not empty"); printf("\n Adding 5 element to queue: "); for(i=1;i<=5;i++){ scanf("%d",&y); Enqueue_sq(&queue,y); } print(queue); GetFront_sq(&queue,&z); printf("Element of the head is: %d\n",z); print(queue); printf("\n Delete 2 elements from queue: "); for(i=1;i<=2;i++){ Delqueue_sq(&queue,&z); printf("%d",z); } printf("\n"); print(queue); if(Empty_sq(&queue)!=0) printf("the queue is empty"); else printf("the queue is not empty"); }
若存储队列的一位数组中所有位置上都有元素,即尾指针指向一维数组最后,而头指针指向一维数组开头,则队列满。这是不能再向队列中插入元素
但是还有一种情况,尾指针指向一维数组最后,但前面有元素已经出队,这时插入元素,仍会发生溢出,而实际上队列并未满。这称为“假溢出”。为解决这个问题,
需要了解循环队列。
相关文章推荐
- 数据结构与算法系列-队列-队列的链式存储
- 顺序队列实现任务以此执行-任务调度系列2
- javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例
- C# 数据结构与算法系列(五) 队列
- Java数据结构与算法之顺序表和链表实现栈和队列
- 数据结构与算法系列-栈-顺序栈
- Azure Messaging-ServiceBus Messaging消息队列技术系列3-消息顺序保证
- 数据结构与算法系列(4)优先队列
- 数据结构与算法系列-队列-循环队列
- C# 数据结构与算法系列(五) 队列
- 11. C#数据结构与算法 -- 顺序队列
- javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例
- 数据结构与算法系列---队列
- 顺序队列(循环队列)
- 停车场(顺序栈,顺序队列)
- Javascript数据结构与算法--队列(顺序队列、优先队列、循环队列)的实现与用法
- 基于链表的队列、基于顺序表的队列 C语言
- 数据结构与算法(C#实现)系列---树(三)_C#教程
- 数据结构与算法Java描述 队列
- 队列的顺序存储和实现