队列的链队表示和实现

一、链队的存储结构

 

//队列的链式存储结构
typedef int QElemType;
typedef struct QNode
{
    QElemType data;
    struct QNode *next;
} QNode,*QueuePtr;

typedef struct
{
    QueuePtr front;//队头指针
    QueuePtr rear;//队尾指针
} LinkQueue;

二、链队的初始化

算法步骤:

(1)生成新的结点作为头结点,队头队尾指针指向此结点。

(2)头结点的指针域置空。

//链队的初始化
void InitQueue(LinkQueue &Q)
{
    //构造一个空队列
    Q.front=Q.rear= new QNode;//生成新的结点作为头结点,队头和队尾指向此结点
    Q.front->next=NULL;//头结点的指针域置空
    cout<<"链队构造成功!"<<endl;
}

 三、链队的入队

算法步骤:

(1)为入队元素分配结点空间,用p指针指向。

(2)将新结点数据域置为e。

(3)将新结点插入到队尾。

(4)修改队尾指针为p。

//链队的入队
void EnQueue(LinkQueue &Q,QElemType e)
{
    //插入元素e尾Q的新的队尾元素
    QNode *p=new QNode;//为入队的元素分配结点kjian,用指针P指向
    p->data=e;//将结点的数据域置为e
    p->next=NULL;//将p的指针域置空
    Q.rear->next=p;//将新结点插入到队尾,也就是把新结点的地址给队尾的next域
    Q.rear=p;//修改队尾指针,新结点为队尾
    cout<<"入队成功!"<<endl;
}

四、链队的出队

算法步骤:

(1)判断队列是否为空,

(2)临时保存队头元素的空间,以备释放。

(3)修改头结点的指针域,指向下一结点。

(4)判断出队元素是否为最后一个元素,若是,则将队尾指针重新赋值,指向头结点。

(5)释放队头元素空间。

//链队的出队
int DeQueue(LinkQueue &Q,QElemType &e)
{
    //删除Q的队头元素,用e返回其值
    if(Q.front==Q.rear)
    {
        cout<<"出队失败,队空!"<<endl;
        return 0;
    }
    QueuePtr p=Q.front->next;//p指向队头元素
    e=p->data;//e保存队头元素的值
    Q.front->next=p->next;//修改头结点的指针域
    if(Q.front==p)//最后一个元素被删,队尾指针指向头结点
    {
        Q.rear=Q.front;
    }
    delete p;//释放队头元素的空间
    cout<<"出队成功!"<<endl;
    return e;
}

五、取链队的队头元素

//取队头元素
int GetHead(LinkQueue Q)
{
    //返回Q的队头元素,不修改头指针

    if(Q.front!=Q.rear)
    {
        return Q.front->next->data;
    }
    else
    {
        cout<<"获取头元素失败,队空!"<<endl;
    }
}

六、输入、输出

void InPutQueue(LinkQueue &Q)
{
    cout<<"希望入队几个元素:";
    int n,e;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cout<<"请输入第"<<i<<"个元素:";
        cin>>e;
        EnQueue(Q,e);
    }
}
void OutPutQueue(LinkQueue &Q){
    QueuePtr p=Q.front->next;//p指向队头元素

    cout<<"- - 队头 - -"<<endl;
    while(p!=NULL){
    cout<<p->data<<endl;
    p=p->next;
    }
    cout<<"- - 队尾 - -"<<endl;
}

七、完整代码

#include <iostream>

using namespace std;

//队列的链式存储结构
typedef int QElemType;
typedef struct QNode
{
    QElemType data;
    struct QNode *next;
} QNode,*QueuePtr;

typedef struct
{
    QueuePtr front;//队头指针
    QueuePtr rear;//队尾指针
} LinkQueue;

//链队的初始化
void InitQueue(LinkQueue &Q)
{
    //构造一个空队列
    Q.front=Q.rear= new QNode;//生成新的结点作为头结点,队头和队尾指向此结点
    Q.front->next=NULL;//头结点的指针域置空
    cout<<"链队构造成功!"<<endl;
}
//链队的入队
void EnQueue(LinkQueue &Q,QElemType e)
{
    //插入元素e尾Q的新的队尾元素
    QNode *p=new QNode;//为入队的元素分配结点kjian,用指针P指向
    p->data=e;//将结点的数据域置为e
    p->next=NULL;//将p的指针域置空
    Q.rear->next=p;//将新结点插入到队尾,也就是把新结点的地址给队尾的next域
    Q.rear=p;//修改队尾指针,新结点为队尾
    cout<<"入队成功!"<<endl;
}
//链队的出队
int DeQueue(LinkQueue &Q,QElemType &e)
{
    //删除Q的队头元素,用e返回其值
    if(Q.front==Q.rear)
    {
        cout<<"出队失败,队空!"<<endl;
        return 0;
    }
    QueuePtr p=Q.front->next;//p指向队头元素
    e=p->data;//e保存队头元素的值
    Q.front->next=p->next;//修改头结点的指针域
    if(Q.front==p)//最后一个元素被删,队尾指针指向头结点
    {
        Q.rear=Q.front;
    }
    delete p;//释放队头元素的空间
    cout<<"出队成功!"<<endl;
    return e;
}
//取队头元素
int GetHead(LinkQueue Q)
{
    //返回Q的队头元素,不修改头指针

    if(Q.front!=Q.rear)
    {
        return Q.front->next->data;
    }
    else
    {
        cout<<"获取头元素失败,队空!"<<endl;
    }
}
void InPutQueue(LinkQueue &Q)
{
    cout<<"希望入队几个元素:";
    int n,e;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cout<<"请输入第"<<i<<"个元素:";
        cin>>e;
        EnQueue(Q,e);
    }
}
void OutPutQueue(LinkQueue &Q)
{
    QueuePtr p=Q.front->next;//p指向队头元素

    cout<<"- - 队头 - -"<<endl;
    while(p!=NULL)
    {
        cout<<p->data<<endl;
        p=p->next;
    }
    cout<<"- - 队尾 - -"<<endl;
}
int main()
{
    LinkQueue Q;
    InitQueue(Q);
    InPutQueue(Q);
    OutPutQueue(Q);

    //出队
    int a;
    int ou= DeQueue(Q,a);
    cout<<ou<<endl;

    int head=GetHead(Q);
    cout<<"头元素是:"<<head<<endl;
    OutPutQueue(Q);


}

字符队列是一种基于实现队列,它可以有效地支持插入删除操作,并且可以动态地分配内存空间,实现数据的高效利用。下面是字符队列表示实现方法: 1. 队列表示 在字符队列表示中,我们需要定义一个表结构体,包含数据域指向下一个节点的指针。由于队列链式的,因此在队列中,我们需要维护一个头指针一个尾指针。 ```c++ typedef struct node { char data; struct node *next; } Node; typedef struct { Node *front; // 头指针 Node *rear; // 尾指针 } Queue; ``` 2. 队列的初始化 队列的初始化操作包括创建一个空队列,将尾指针初始化为NULL。 ```c++ void InitQueue(Queue *Q){ Q->front = Q->rear = NULL; // 尾指针初始化为NULL } ``` 3. 入操作 入操作包括在尾插入一个元素,并更新尾指针。由于是链式队列,因此插入操作可以直接在表末尾添加新节点。 ```c++ void EnQueue(Queue *Q, char x){ Node *p = (Node*)malloc(sizeof(Node)); // 创建新节点 p->data = x; // 插入新元素 p->next = NULL; if(Q->rear == NULL){ // 队列为空 Q->front = Q->rear = p; // 新节点为尾 } else{ Q->rear->next = p; // 新节点插入尾 Q->rear = p; // 更新尾指针 } } ``` 4. 出操作 出操作包括删除头元素,并更新头指针。由于是链式队列,因此删除操作可以直接删除表的第一个节点。 ```c++ bool DeQueue(Queue *Q, char *x){ if(Q->front == NULL) // 队列为空 return false; Node *p = Q->front; // 删除头节点 *x = p->data; // 取出头元素 Q->front = p->next; // 更新头指针 free(p); // 释放内存空间 if(Q->front == NULL) // 队列已空 Q->rear = NULL; // 更新尾指针 return true; } ``` 5. 获取队列长度 获取队列长度操作需要遍历整个表,统计表中元素的个数。 ```c++ int GetQueueLength(Queue *Q){ int len = 0; Node *p = Q->front; while(p != NULL){ len++; p = p->next; } return len; } ``` 这些就是字符队列表示实现方法。在实际应用中,我们可以根据需要进行相应的修改扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值