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

数据结构8:队列的顺序存储结构表示和实现

2014-04-10 14:56 573 查看
1、数据结构的物理存储有顺序和链式之分,但是队列的实现,通常使用链式,因为比较简单一点,但是顺序也是要提一下的,说到底顺序结构就是利用数组搞起;

2、在声明一个队列的数据结构的时候,和链表声明[数据结构6]不一样,只需要一个数组和两个下标就可以了!我就是不明白了,这帮牛逼的人是怎么想出来这些数据结构的!

3、通常情况下,最简单地顺序结构实现队列的思路是:在数组的末端输入,在a[0]的地方删除,删除了元素之后,数组中的所有元素都往前移动一位,这样插入的时间复杂度为O(1),删除的复杂度为O(n),这个复杂度略大;后来人们就想到,使用两个指针,一个指头,一个指尾,删除操作不需要挪动后续元素,只需要将头指针改变一下就OK了;这样又会有一个问题呀,就是说首先数组的长度是有限的,其次,当删除了队前元素的时候,这个地方就空着了,有人就开始想了循环队列的概念:就是说删除了的空间可以被插入操作来使用;

4、判断队列的空或者满栈的话,采用的取余的运算,这样两个下标就可以一直在数组内循环,并且通过判断下标的是否相同来判断是否为空或者满栈!

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10
#define ERROR 0
#define OK 1

typedef int ElemType;
typedef int Status;
typedef struct SqQuene{
ElemType *base;
int front;
int rear;
}SqQuene,*Quene;

void InitQuene(Quene Q)
{
Q->base = (ElemType *)malloc(MAXSIZE*sizeof(SqQuene));
if (!Q->base)
{
printf("没有足够空间了!");
exit(0);
}
Q->front = Q->rear = 0;
}

//插入元素
void InsertQuene(Quene Q,ElemType e)
{
if ((Q->rear+1)%MAXSIZE == Q->front)
{
printf("Game Over");
exit(0);
}
Q->base[Q->rear] = e;
Q->rear = (Q->rear+1)%MAXSIZE;
}

Status DeleteQuene(Quene Q,ElemType *e)
{
if ((Q->front+1)%MAXSIZE == Q->rear)
{
printf("队列已经满了!");
exit(0);
}
*e = Q->base[Q->front];
Q->front = (Q->front+1)%MAXSIZE;
}

void main()
{
int i;
ElemType e;
SqQuene Q;
InitQuene(&Q);
for (i = 0;i<MAXSIZE-1;i++)
{
InsertQuene(&Q,i+1);
printf("the number is %d:\n",Q.base[Q.rear-1]);
}
for (i = 0;i<MAXSIZE-1;i++)
{
DeleteQuene(&Q,&e);
printf("删除元素为%d:\n",e);
}
while(1);
}
注:

1、如何判断循环的;

2、如何声明该数据结构的!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: