【数据结构】队列的链式实现和操作(队列的建立,入队,出队)

队列是一种特殊的数据结构。与“栈”大不相同的是,队列要求“先进先出”,即只有队尾可以插入,只有队首可以弹出。但其创建或操作的基本思路与“栈”大致相同,唯一不同的是链式队列拥有top和base两个指针。
由于思路大致相同,我在这篇文章中只写不同点和注意点。

(“栈”有关的知识请到这里学习:【数据结构】栈的链式实现和操作(创建栈,入栈,出栈,获取栈顶元素)


注意点:

①入队时:与栈不同的是,队列的入队时从队尾入,所以显然是尾插法。而先进后出的栈则是头插法。

②入队和出队时,均要考虑空队时的情况。
(1)入空队:此时top和base指针均指向NULL,当第一个元素入队时,我们只需要将top和base同时指向这个节点。而后续的入队,则是需要将base指针向后移位的。
(2)空队无法出队,需要返回错误信息。


*完整代码:

#ifndef _LWCQueue_H_
#define _LWCQueue_H_

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct Node Node;
typedef struct Queue Queue;
typedef int elemtype;
typedef struct Node* PNode;
typedef struct Queue* PQueue;

struct Node
{
    elemtype data;
    struct Node* next;
};

struct Queue
{
    struct Node* top;
    struct Node* base;
    size_t size;
};

PNode Create_Node(elemtype x)
{
    PNode L=(PNode)malloc(sizeof(Node));
    L->data=x;
    L->next=NULL;

    return L;
}

PQueue Create_Queue()
{
    PQueue L=(PQueue)malloc(sizeof(Queue));
    L->top=L->base=NULL;      //初始时top指针和base指针重合,都指向NULL
    L->size=0;

    return L;
}
/*队列:top-> xxx -> xxx -> xxx -> ......-> base -> NULL*/
void Push(elemtype x,PQueue L)    //入队,指的是从队尾base指针处连接元素
{
    PNode newnode=Create_Node(x);
    if (L->size==0)
    {
        L->top=L->base=newnode;
        L->size++;
    }
        else 
        {
            L->base->next=newnode;   //尾插法
            L->base=newnode;      //base指针后移
            L->size++;
        }
}

void Pop(PQueue L)    //出队,指的是弹出top处的元素
{
    if(L->size==0)
    {
        printf("NULL!Pop Error!\n");
        exit(0);
    }
    else 
    {
        PNode nextnode=L->top->next;
        free(L->top);
        L->top=nextnode;
        L->size--;
    }
}

elemtype Gettop(PQueue L)    //获取top位置的元素
{
    return (L->top->data);
}

elemtype Getbase(PQueue L)
{
    return (L->base->data); 
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值