您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法系列-队列-顺序队列

2013-11-10 22:08 471 查看
定义:

队列:

队列也是一种特殊的线性表,它仅允许在表的一端进行插入,在表的另一端进行删除,允许插入的一端称为队尾(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");

}


若存储队列的一位数组中所有位置上都有元素,即尾指针指向一维数组最后,而头指针指向一维数组开头,则队列满。这是不能再向队列中插入元素

但是还有一种情况,尾指针指向一维数组最后,但前面有元素已经出队,这时插入元素,仍会发生溢出,而实际上队列并未满。这称为“假溢出”。为解决这个问题,

需要了解循环队列。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: