队列的实现C/C++

1.队列的基本定义

队列是一种只能在队头进行删除在队尾进行添加的数据结构,基本的形式如下图,在头指针处可删除,在尾指针处可添加

2.存在的问题

在c/c++中使用malloc分配的空间大小是固定的

在增加和删除的过曾中不断的有空间被废弃,线性表的基地址不断移动,造成很大的空间浪费

如图

3.解决之道

因此出现了另一种结构来解决这个问题

循环结构(如图),即数据空间构成一个环,使得删改不断在这个环中进行,这样完美的解决了空间浪费等问题

4队列的代码实现

    • 链队列(由链表生成的队列)

基本结构(结点定义)
typedef struct Node
{
    int data;
    struct Node* next;
}dnode,*dLinkNode;       
链栈的存储(实际上就存储指向头结点和尾结点的指针)
typedef struct {
    dLinkNode front, rear; // 队头指针、队尾指针
}* LinkQueue,queue;
初始化(为链表分配空间)
LinkQueue crease()       //创建队列并初始化(即创建第一个结点并给头指针尾指针赋空间并初始化)
{
    dLinkNode L;
    L = (dLinkNode)malloc(sizeof(dnode));
    L->next = L;      //创建头结点初始化(由于是循环所以指向自身)
    LinkQueue F;
    F = (LinkQueue)malloc(sizeof(queue));
    F->front = L;
    F->rear = L;        //创建头指针尾指针初始化
    return F;
}
入队(类似于链表的尾插法)
void qinsert(LinkQueue L,int n)   //入队(类似于尾插法)
{
    int x;
    cin >> x;
    (L->front)->data = x;        //循环链表我们就不设置一个空的头结点了
    for (int k = 1; k < n; k++)
    {
        dLinkNode H;
        H = (dLinkNode)malloc(sizeof(dnode));
        cin >> x;
        H->data = x;
        L->rear->next = H;
        H->next = L->front;
        L->rear = H;
    }
}
出队

我们使用一个vector对象来存储对列中的元素

vector<int> out(LinkQueue L,int n) //出队(用vector来保存出队的数据)
{
    vector<int>arr(n);
    for (int i = 1; i <= n; i++)
    {
        
        if (L->front == L->rear)
        {
            cout << "error" << endl;
            break;
        }
        arr[(i - 1)] = L->front->data;
        L->rear->next = L->front->next;
        L->front = L->front->next;              //更新队头指针指向的位置
    }
    return arr;
}
打印(实际上即遍历队列)
void Print(LinkQueue L)
{
    dLinkNode H;
    H = L->front;
    while (H!= L->rear)
    {
        cout << H->data << ',';
        H = H->next;
    }
    cout << H->data << endl;
}

5.完整代码

#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;


typedef struct Node
{
    int data;
    struct Node* next;
}dnode,*dLinkNode;       


typedef struct {
    dLinkNode front, rear; // 队头指针、队尾指针
}* LinkQueue,queue;

LinkQueue crease()       //创建队列并初始化(即创建第一个结点并给头指针尾指针赋空间并初始化)
{
    dLinkNode L;
    L = (dLinkNode)malloc(sizeof(dnode));
    L->next = L;      //创建头结点初始化(由于是循环所以指向自身)
    LinkQueue F;
    F = (LinkQueue)malloc(sizeof(queue));
    F->front = L;
    F->rear = L;        //创建头指针尾指针初始化
    return F;
}

void qinsert(LinkQueue L,int n)   //入队(类似于尾插法)
{
    int x;
    cin >> x;
    (L->front)->data = x;        //循环链表我们就不设置一个空的头结点了
    for (int k = 1; k < n; k++)
    {
        dLinkNode H;
        H = (dLinkNode)malloc(sizeof(dnode));
        cin >> x;
        H->data = x;
        L->rear->next = H;
        H->next = L->front;
        L->rear = H;
    }
}



vector<int> out(LinkQueue L,int n) //出队(用vector来保存出队的数据)
{
    vector<int>arr(n);
    for (int i = 1; i <= n; i++)
    {
        
        if (L->front == L->rear)
        {
            cout << "error" << endl;
            break;
        }
        arr[(i - 1)] = L->front->data;
        L->rear->next = L->front->next;
        L->front = L->front->next;              //更新队头指针指向的位置
    }
    return arr;
}

void Print(LinkQueue L)
{
    dLinkNode H;
    H = L->front;
    while (H!= L->rear)
    {
        cout << H->data << ',';
        H = H->next;
    }
    cout << H->data << endl;
}

int main()
{
    int n = 5;
    vector<int>arr(n);
    LinkQueue L;
    L = crease();
    qinsert(L, 10);                        //用1,2,3,4,5,6,7,8,9,10测试
    Print(L);
    arr=out(L, n);
    for (int k = 0; k < n; k++)
        cout << arr[k] << ' ';
    cout << endl;
    Print(L);

}

6.运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值