数据结构之顺序队列

来源:互联网 发布:淘宝购物评级怎么提升 编辑:程序博客网 时间:2024/05/22 04:58

本次的主题是队列,队列是另一种限定性的线性表(当然是人为规定的),即:它只允许在表的一端插入元素,在另一端删除元素,故具有先进先出(FIFO)的特性。

本次的代码主要涉及到队列的基本操作:
对列的初始化:initsqueueu()
入队操作:entersequeue(sequeue*q,int x)
出队操作:delsequeue(sequeue*q,int*x)
判空操作:empty(sequeue*q)
取队首元素:getseq(sequeue*q,int*x)
打印队列:print(sequeue q)

顺序队列的初始化,使用两个指针front和rear。

typedef struct{    int data[max];    int front,rear;}sequeue;

为了实现基本操作,我们约定在非空队列中,头指针front总是指向当前队列的第一个元素的前一个位置,而尾指针rear则总是指向当前队列最后一个元素的所在位置。

因此,我们可以完成一些具体的要求:
队列的初始化条件:q->front=q->rear=-1

队满条件:q->rear=max-1

对空条件:q->front=q->rear

好了,闲话少说,show the code

#include<stdio.h>#define max 10typedef struct{    int data[max];    int front,rear;}sequeue;sequeue initsequeue(){    sequeue q;    q.front=-1;    q.rear=-1;    return q;}int getseq(sequeue*q,int*x){    if(q->front==q->rear)    return 0;    else     {        *x=q->data[(q->front)+1];        return 1;    }}int entersequeue(sequeue*q,int x){    if(q->rear==max-1)    return 0;    q->rear++;    q->data[q->rear]=x;    return 1;}int empty(sequeue*q){    return (q->front==q->rear); }int delsequeue(sequeue*q,int*x){    if(q->front==q->rear)    return 0;    else     {        q->front++;        *x=q->data[q->front];        return 1;    }}void print(sequeue q){    int n;    if(q.front!=q.rear)    {        puts("the sequeue out:");        for(n=q.front+1;n<q.rear;n++)        printf("%d ",q.data[n]);    }    else printf("the sequque is empty");}int main() {    sequeue queue;    int n,y,z,i,j;    queue=initsequeue();    if(empty(&queue)!=0)    printf("it is empty");    else printf("\nit is not empty");    printf("\ninput the number:");    scanf("%d",&n);    printf("your number:\n");    for(i=1;i<=n;i++)    {        scanf("%d",&y);        entersequeue(&queue,y);    }    print(queue);    getseq(&queue,&z);    printf("\nnow the front:%d\n",z);    print(queue);    printf("\nyou want to out number:");    scanf("%d",&j);    printf("the had out's sequeue:");    for(i=1;i<=j;i++)    {        delsequeue(&queue,&z);        printf("%d ",z);    }    printf("\n");    print(queue);    if(empty(&queue)!=0)    printf("the queue is empty\n");    else printf("\nthe queue is not empty\n");    return 0;}

运行截图

这里写图片描述

总结
还是那句话,这一次的代码虽然长,但是都是由一些定义的函数堆积起来的,或许未来的工程项目也会是如此这般吧。理解起来并非困难,重要的还是对于顺序队列的基本概念的熟悉,当然,还有最重要的是前面的扎实的基础。

原创粉丝点击