2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 【数据结构】顺序循环队列及其实现(C语言)

【数据结构】顺序循环队列及其实现(C语言)

时间:2019-07-27 19:51:27

相关推荐

【数据结构】顺序循环队列及其实现(C语言)

给定一个大小为MAXSIZE的数组储存一个队列,经过若干次的插入和删除以后,当队尾指针 rear = MAXSIZE 时,呈现队列满的状态,而事实上数组的前部可能还有空闲的位置。为了有效地利用空间,引入循环队列(环状)。

在循环队列中,如果队列中最后一个结点存放在数组的最后一个元素位置,而数组前面有空位置的话,则下次在进行插入操作时,将插入到数组最前面那个元素的位置。其他情况下的插入操作和一般的队列的插入操作一样。

如果再插入一个新的结点,则数组空间将全部被占用,队列已满,且rear == front。

若删除一个结点,队列成为空队列,也有 rear == front。

如何区别?

方法一:

设置一个标志。由于rear+1使rear==front -> 满队列

由于 front +1 使rear == front -> 空队列

方法二:

牺牲一个数组元素的空间,即若数组大小为MAXSIZE,该数组所表示的循环队列最多允许储存MAXSIZE-1个结点。

循环队列满的条件:(rear+1)%MAXSIZE == front

循环队列空的条件: rear == front

#include <stdio.h>#include <stdlib.h>const int MAXSIZE = 5;typedef struct {int a[MAXSIZE];int front;int rear;}sequence_queue;void init(sequence_queue *sq){sq->front=0;sq->rear=0;}void insert(sequence_queue *sq,int x){if((sq->rear+1)%MAXSIZE==sq->front){printf("full\n");return ;}sq->a[sq->rear]=x;sq->rear=(sq->rear+1)%MAXSIZE;printf("front = %d\n",sq->front);printf("rear = %d\n",sq->rear);}void del(sequence_queue *sq){if(sq->front==sq->rear){printf("none\n");return ;}sq->front=(sq->front+1)%MAXSIZE;printf("front = %d\n",sq->front);printf("rear = %d\n",sq->rear);}void display(sequence_queue sq){int i=sq.front;if(sq.front==sq.rear){printf("none\n");return ;}while(i!=sq.rear){printf("%5d",sq.a[i]);i++;i=i%MAXSIZE;}printf("\n");}int main (){sequence_queue sq;int x,a;init(&sq);while(1){scanf("%d",&x);switch(x){case 1:{scanf("%d",&a);insert(&sq,a);display(sq);printf("\n");break;}case 2:{del(&sq);display(sq);printf("\n");break;}default:{printf("只能输入1或者2\n");break;}}}return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。