浅谈【数据结构】栈和队列之队列

目录

1、队列

1.1思想

2、队列的两类

2.1顺序队列

2.2链式队列


谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注

没错,说的就是你,不用再怀疑!!!

希望我的文章内容能对你有帮助,一起努力吧!!!


1、队列

1.1思想

  • 先进先出,后进后出
  • 例如:排队买奶茶
    • 入队:队伍新增一个来买奶茶的人。(应当要排在队伍最后面)
    • 出队:有一个一个买到了奶茶离开队伍。(应当是队伍第一个人)

2、队列的两类

2.1顺序队列

  • 数组+整型===>结构体

struct queue {

        int head; // 表示队头

        int tail; // 表示队尾

        ElementType queue[MAXLENG]; // 数组:表示队列的空

};

  • 地址是连续
  • 循环队列解决无法回到起点问题
  • 循环队列存在一个空间会浪费
    • 解决:在结构体再定义一个长度

示例代码:

#include <iostream>

#define QUEUEERR 0xefffff
#define MAX 10
/*
    为空:head和tail相等的时候
    为满:tail减head等于10的时候
    head:指向已出元素的位置
    tail:指向待入队元素的位置
*/
typedef struct Queue
{
    int length;
    int head;
    int tail;
    int q[MAX];
}Queue;

Queue *createSeqQueue()
{
    Queue *q = new Queue;

    // 初始化为空
    q->head = 0;
    q->tail = 0;

    return q;
}

/*
    @brief 入队
    @param queue 需要入队的队列指针
    @param data 需要入队的数据
    @return 成功返回true,失败返回false
*/
bool push_data(Queue *queue, int data)
{
    std::cout << "tail:" <<queue->tail << std::endl;

    // 判断队列是否是满的
    if((queue->tail+1)%MAX==queue->head) // 就是判断下一个位置是不是head
        return false;

    // 重置下标
    queue->tail = (queue->tail+1)%MAX;
    queue->q[queue->tail] = data;
    return true;
}

/*
    @brief 出队
    @param queue需要出队的队列指针
    @return 成功返回出队的元素,失败返回QUEUEERR
*/
int pop_data(Queue *queue)
{
    // 判断队列是否空了
    /*
        if(queue->head == queue->tail-1) // 越界非常严重
        return QUEUEERR;
    */ 
    std::cout << "head:" << queue->head << std::endl;
    if(queue->tail == queue->head)
        return QUEUEERR;
    int data = queue->q[queue->head];
    queue->head = (queue->head+1)%MAX;
    return data;
}


int main()
{
    Queue *queue = createSeqQueue();

    // 存元素
    for(int i = 1;i <= 20;i ++)
    {
        if(push_data(queue,i))
            std::cout << "存入" << i << "个" << std::endl;
        else 
            break;

    }
    std::cout << queue->tail << std::endl;

    while(1)
    {
        int data = pop_data(queue);
        if(data == QUEUEERR)
            break;
        std::cout << data << std::endl;
    }
    return 0;
}


2.2链式队列

带头结点的单链表实现

示例代码:

#include <iostream>

#define QUEUEERR 0xefffff

struct node 
{
    int data;
    struct node *next;
};


struct head
{
    struct node *first;
    struct node *final;
};

struct head *createListQueue()
{
    struct head *queue = new struct head;
    queue->final = nullptr;
    queue->first = nullptr;

    return queue;
}

/*
    头插
*/
void push_data(struct head *queue,int data)
{
    if(!queue)
        return;

    struct node *node_ptr = new struct node;
    node_ptr->data = data;
    node_ptr->next = queue->first;
    queue->first = node_ptr;

    // 作为第一个结点插入的时候
    if(queue->final == nullptr)
        queue->final = node_ptr;
}


/*
    尾取
*/
int pop_data(struct head*queue)
{
    if(!queue)
        return QUEUEERR;

    if(queue->first == nullptr)
        return QUEUEERR;
        
    if(queue->first == queue->final)
    {
        int data = queue->final->data;
        queue->first = nullptr;
        queue->final = nullptr;
        return data;
    }

    int data = queue->final->data;
    struct node *node_ptr = queue->final;
    queue->final = queue->first;

    // 更新队列final指针
    while(queue->final->next != node_ptr)queue->final = queue->final->next;

    return data;
}

int main()
{
    struct head *queue = createListQueue();
    std::cout << __LINE__ << std::endl;

    push_data(queue,5);
    push_data(queue,4);
    push_data(queue,3);
    push_data(queue,2);
    push_data(queue,1);
    push_data(queue,0);

    std::cout << pop_data(queue) << std::endl;
    std::cout << pop_data(queue) << std::endl;
    std::cout << pop_data(queue) << std::endl;


    while(1)
    {
        int data = pop_data(queue);
        if(data == QUEUEERR)
            break;
        std::cout << data << std::endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值