栈与队列:链队列算法+可执行代码

Posted zhenglijie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈与队列:链队列算法+可执行代码相关的知识,希望对你有一定的参考价值。

1.队列是只允许在一端进行插入 在另一端进行删除的线性表
2.队列先进先出
//队列的链式存储结构(插进去 吐出来) 
typedef struct QNode
{
    ElemType data;
    struct QNode *next;
}QNode, *QueuePrt;
typedef struct
{
    QueuePrt front,rear;//队头,尾指针 
}LinkQuene;

initQueue(LinkQueue *q)  //初始化 
{
    q->front = q->rear = (QuenuePtr)malloc(sizeof(QNode));
    if(!q->front)
    exit(0);
    q->front->next = NULL;
}

InsertQueue(LinkQueue *q, ElemType e)  //插入 
{
    QueuePtr p;
    p = (QueuePtr)malloc(sizeof(QNode));
    if(p == NULL);
    exit(0);
    p->data = e;
    p->next = NULL;
    q->rear->next = p;
    q->rear = p;  //指向把新插入的结点
}

DeleteQuenue(LinkQueue *q,ElemType *e)
{
    QueuePtr p;
    if(q->front == q->rear)  //如果是空队列 返回 
    return;
    p = q->front->next; //让p指向第一个结点 
    *e = p->data;  //用指针获取 
    q->front->next = p->next; //头结点的指针指向第二个结点
    if(q->rear == p) //只有一个元素 因为上面p已经指向第一个结点了 
    q->rear = q->front;
    free(p); 
}

DestoryQueue(LinkQueue *q)//销毁队列 
{
    while(q->front)  
    {
        q->rear = q->front->next;//把尾指针指向第一个元素 
        free(q->front);
        q->front = q->rear;
    }
}

GetHead(LinkQueue q)   //获取头元素 
{
    if(q.front!=q.rear)
    return q.front->next->data;
}


//链队列可执行代码
#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define ERROR -1

typedef int QElemType;
typedef int Status;
typedef int SElemType;

typedef struct QNode
{
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
    QueuePtr front; //队头指针 
    QueuePtr rear;  //队尾指针 
}LinkQueue;

Status InitQueue(LinkQueue *Q);  //初始化队列 
Status EnQueue(LinkQueue *Q, QElemType e); //入队列 
Status DeQueue(LinkQueue *Q, QElemType *e); //出队列 
SElemType GetHead(LinkQueue Q); //获取队列头元素 

Status InitQueue(LinkQueue *Q)
{
    Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
    if(Q->front == NULL)
    {
        exit(0);
    }
    Q->front->next = NULL;
    return OK;
}

Status EnQueue(LinkQueue *Q, QElemType e)
{
    QueuePtr p;
    p = (QueuePtr)malloc(sizeof(QNode));
    if(p == NULL)
    {
        exit(0);
    }    
    p->data = e;
    p->next = NULL;
    Q->rear->next = p;
    Q->rear = p;
    return OK;
}

Status DeQueue(LinkQueue *Q, QElemType *e)
{
    QueuePtr p;
    if(Q->front == Q->rear)  //如果为空 
    {
        return ERROR;
    }
    p = Q->front->next; //让p指向第一个结点
    *e = p->data;
    Q->front->next = p->next;
    if(Q->rear == p)  //如果只剩下最后一个元素 需要调整尾指针的值 
    Q->rear = Q->front;
    free(p); 
    return OK;
}

SElemType GetHead(LinkQueue Q)
{
    if(Q.front != Q.rear)
    return Q.front->next->data;
}

int main(void)
{
    LinkQueue q;
    int e;
    int heade;
    InitQueue(&q);
    printf("请输入队列元素,用空格隔开,以0结束
");
    scanf("%d",&e);
    while(e != 0) 
    {
        EnQueue(&q,e);
        scanf("%d",&e);
    }
    printf("链队列的队头元素是: ");
    heade = GetHead(q);
    printf("%d",heade);
    printf("
");
    while(q.front != q.rear)
    {
        DeQueue(&q,&e);
        printf("%d ",e);
    }
    
    return 0;
} 

 

以上是关于栈与队列:链队列算法+可执行代码的主要内容,如果未能解决你的问题,请参考以下文章

图解堆算法链表栈与队列(Mark)

万字总结图解堆算法链表栈与队列(多图预警)

栈与队列试题中的操作代码

[算法] leetcode栈与队列相关题目详解

算法_栈与队列的Java链表实现

栈与队列小结