数据结构队列基本操作

本章内容:顺序队、链队的结构定义、判断队空、进队、出队以及主函数测试

顺序队:

#include <stdio.h>
#include <stdlib.h>
#define maxsize 5
typedef struct
{
    int data[maxsize];
    int front;
    int rear;
}Queue;
//初始化
void initQueue(Queue &Q)
{
    Q.front=0;
    Q.rear=0;
}
//判断为空
int isEmpty(Queue Q)
{
    if(Q.front==Q.rear)
        return 1;
    return -1;
}
//进队
int inQueue(Queue &Q,int x)
{
    //判断是否队满
    if((Q.rear+1)%maxsize==Q.front)
        return -1;
    //rear指向最后一个元素,所以先往后指向队列后面空元素再赋值
    Q.rear=(Q.rear+1)%maxsize;
    Q.data[Q.rear]=x;
    return 1;
}
//出队
int outQueue(Queue &Q,int x)
{
    //判断是否队空
    if(Q.front==Q.rear)
        return -1;
    //front指向队列前面空指针,所以先往后移动再出队,出此时front指针的data,(值不用改变,根据指针来判断,他有数值也是空)
    Q.front=(Q.front+1)%maxsize;
    x=Q.data[Q.front];
    return x;
}
int main()
{
    //关于为何是maxsize=5,却只有四个元素,详细请见数据结构课本中关于队列会有一个 预留位置 的相关知识
    Queue Q;
    initQueue(Q);
    int x=isEmpty(Q);
    printf("%d\n",x);
    inQueue(Q,1);
    inQueue(Q,2);
    inQueue(Q,3);
    inQueue(Q,4);
    //测试队满入队
    printf("%d\n",inQueue(Q, 99));
    printf("%d\n",outQueue(Q, x));
    printf("%d\n",outQueue(Q, x));
    printf("%d\n",outQueue(Q, x));
    printf("%d\n",outQueue(Q, x));
    //测试队空入队
    printf("%d\n",outQueue(Q, x));
    return 0;
}

链队:

#include <stdio.h>
#include <stdlib.h>
#define maxsize 5
//队结点
typedef struct Node
{
    int data;
    struct Node *next;
}Node,*DNode;
//指针队列
typedef struct Queue
{
    DNode front;
    DNode rear;
    //==Node *front,*rear
}Queue,*DQueue;
//初始化
void initQueue(DQueue &Q)
{
    Q=(DQueue)malloc(sizeof(Queue));
    Q->front=Q->rear=NULL;
}
//判断队为空
int isEmpty(DQueue Q)
{
    if(Q->front==Q->rear)
        return 1;
    return -1;
}
//入队
void inQueue(DQueue &Q,int x)
{
    //理论上不存在队满,除非内存满了,所以不用判断队满
    //申请队结点
    DNode q;
    q=(DNode)malloc(sizeof(Node));
    q->next=NULL;
    q->data=x;
    //如果队空,则插入结点为队首结点
    if(Q->rear==NULL)
        Q->front=Q->rear=q;
    else
    {
        //y队不为空,尾指针所指的结点的next连接上q,同时后移尾指针
        Q->rear->next=q;
        Q->rear=q;
    }
}
//出队
int outQueue(DQueue &Q,int x)
{
    //队空不能出队,两个结点都不为空即可。就是有一个结点为空即队空
    if(Q->front==NULL || Q->rear==NULL)
        return -1;
    DNode q;
    //出队结点一定是front指向的结点,用一个结点q存储和释放出队结点
    q=Q->front;
    //判断是否仅有一个结点,仅有一个结点与多个结点处理起来不同
    if(Q->front==Q->rear)
        Q->front=Q->rear=NULL;
    else
        Q->front=Q->front->next;
    x=q->data;
    free(q);
    return x;
}
int main()
{
    DQueue Q;
    int x;
    initQueue(Q);
    printf("%d\n",isEmpty(Q));
    inQueue(Q, 11);
    inQueue(Q, 4);
    inQueue(Q, 7);
    inQueue(Q, 9);
    x=outQueue(Q, x);
    printf("%d\n",x);
    x=outQueue(Q, x);
    printf("%d\n",x);
    x=outQueue(Q, x);
    printf("%d\n",x);
    x=outQueue(Q, x);
    printf("%d\n",x);
    //队空出队测试
    x=outQueue(Q, x);
    printf("%d\n",x);
    return 0;
}

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值