队列的实现(C语言版)

一.队列的定义:

        只允许一端插入,在另一端删除操作的线性表。允许插入操作的一端称为队尾,允许删除操作的一端称为队头。满足先进先出的特性。

二.队列的顺序存储结构。

        队列的顺序存储结构也称为顺序队列。

        我们约定front指向队头的前一个元素,rear指向队尾元素。随着元素的添加,数组会存满。但是当我们取出元素之后,低端还有空位置。这种现象叫做假溢出。我们解决的办法就是当存满之后,继续往下标最小的位置延续。这样的顺序队列,我们称为循环队列。

三.循环队列的实现

//存储结构定义
#define QueueSize 100
typedef int dataType;
typedef struct{
    dataType data[QueueSize];
    int front,rear;
}Queue;
//初始化
void initQueue(Queue *q){
    q->front=q->rear=-1;
}
//入队
void push(dataType x,Queue * q){
    if((q->rear+1)%QueueSize==q->front) throw "上溢异常";
    q->rear=(q->rear+1)%QueueSize;
    q->data[q->rear]=x;
}
//出队
dataType pop(Queue *q){
    if(q->rear==q->front) throw "下溢异常";
    q->front=(q->front+1)%QueueSize;
    return q->data[q->front];
}
//取队头元素
dataType top(Queue * q){
    if(q->front==q->rear) throw "下溢异常";
    return q->data[(q->front+1)%QueueSize];
}
//判空
int empty(Queue * q){
    if(q->front==q->rear) return 1;
    else return 0;
}

四.队列的链接存储

图示:

    代码部分:

#include<stdlib.h>
//定义存储结构
//头指针指向链队列的头结点,尾指针指向终端结点
typedef int dataType;
typedef struct Queue{
    dataType data;
    Queue * next;
}Queue;
//定义头尾指针
Queue * front,*rear;
//初始化
void initQueue(Queue *q){
    front=rear=(Queue*)malloc(sizeof(Queue));
    front=rear=NULL;
}
//入队
void push(dataType x){
    Queue * node=(Queue*)malloc(sizeof(Queue));
    node->data=x;
    node->next=NULL;
    rear->next=node;
    rear=node;
}
//出队
dataType pop(){
    if(rear==front) throw "下溢异常";
    dataType x=front->next->data;
    front->next=front->next->next;
    if(front->next->next==NULL) rear=front;
    return x;
    
}
//取队头元素
dataType top(){
    if(rear==front) throw "下溢异常";
    return front->next->data;
}
//判空
int empty(){
    if(rear==front) return 1;
    else return 0;
}
//队列的销毁
void destoryQueue(){
    Queue * node,*temp;
    node =front->next;
    while(node !=NULL){
        temp=node->next;
        free(node);
        node=temp;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值