数据结构之顺序队列

本次的主题是队列,队列是另一种限定性的线性表(当然是人为规定的),即:它只允许在表的一端插入元素,在另一端删除元素,故具有先进先出(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 10
typedef 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;

}

运行截图

这里写图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值