美文网首页
从0开始——线性表的应用:队列

从0开始——线性表的应用:队列

作者: c枫_撸码的日子 | 来源:发表于2018-11-12 18:56 被阅读0次

队列

1.队列的定义
队列是只运行在一端进行插入,另一端进行删除的线性表。
先进先出(FIFO)
2.队列的抽象数据结构

ADT 队列
Data
  同线性表
Operation
  InitQueue(*Q);//初始化队列
  DestroyQueue(*Q);//销毁队列
  ClearQueue(*Q);//清空队列
  IsEmpty(*Q);//队列是否为空
  EnQueue(*Q,e);//入队
  DeQueue(*Q,*e);//出队
  GetHead(*Q,*e);//获取队头元素
  GetLength(*Q);//获取队列长度

3.循环队列-顺序存储

#include <stdio.h>
#include <windwos.h>

#define MAXSIZE 30
#define ERROR 0
#define OK 1

//循环队列的顺序存储结构 
typedef struct SqQueue
{
    int data[MAXSIZE];
    int front;//头指针
    int rear;//尾指针  
}SqQueue;

//初始化循环队列 
void InitQueue(SqQueue *Q)
{
    Q->data[MAXSIZE]= {0};
    Q->front = 0;
    Q->rear = 0;
}

//获取队列长度
int GetLength(SqQueue *Q)
{
    return (Q->rear-Q->front+MAXSIZE)%MAXSIZE;
} 

//入队
int EnQueue(SqQueue *Q,int e)
{
    if((Q->rear+1)%MAXSIZE == Q->front)//队列满的判断 
    {
        printf("队列已满,无法入队\n");
        return ERROR; 
    }
    Q->data[Q->rear]=e;//入队 
    Q->rear=(Q->rear+1)%MAXSIZE;//注意这里不是Q->rear++ 
    return OK;
} 

int DeQueue(SqQueue *Q,int *e)
{
    if(Q->rear == Q->front)//队列为空 
    {
        printf("队列为空,无法出队\n");
        return ERROR;   
    }
    *e = Q->data[Q->front];
    Q->front = (Q->front+1)%MAXSIZE;
} 

4.队列的链式存储

#include <stdio.h>
#include <windwos.h>

#define ERROR 0
#define OK 1

//结点 
typedef struct Node
{
    int data;
    struct Node *next;
} Node;

//循环队列的链表存储结构 
typedef struct LinkQueue
{
    Node* front;//头指针
    Node* rear;//尾指针    
}LinkQueue;

//初始化循环队列 
void InitQueue(LinkQueue *Q)
{
    Q->front = NULL;
    Q->rear = NULL;
}


//入队
int EnQueue(LinkQueue *Q,int e)
{
    Node* s = (Node*)malloc(sizeof(Node)); 
    if(s == NULL)//分配内存失败 
    {
        printf("分配内存失败,无法入队\n");
        return ERROR; 
    }
    
    s->data = e;
    s->next = NULL;
    Q->rear->next = s;//把s赋给原队尾的后继结点 
    Q->rear = s; //rear指向s 队尾 
    return OK;
} 

int DeQueue(LinkQueue *Q,int *e)
{
    if(Q->front == Q->rear)
    {
        printf("队列为空,无法出队\n"); 
        return ERROR; 
    } 
    Node * p = Q->front->next;//指向第一个节点
    *e = p->data;//被删除的元素 
    Q->front->next = p->next;//删除第一个节点
    
    if(Q->rear == p)
        Q->front == Q->rear;
    free(p); 
    return OK;
} 

相关文章

  • 从0开始——线性表的应用:队列

    队列 1.队列的定义队列是只运行在一端进行插入,另一端进行删除的线性表。先进先出(FIFO)2.队列的抽象数据结构...

  • 从0开始——线性表的应用:栈

    1.栈 栈的定义栈是只允许在表尾插入和删除的线性表。允许插入和删除的一端叫成为栈顶,另一端成为栈底。后进先出(LI...

  • 从0开始——线性表

    一、ADT:抽象数据类型(abstract data type) 之前学习过ADT的概念:其实就是数据+操作的集合...

  • Ⅱ. 栈和队列

    栈和队列都是线性结构,可以用线性表在某种条件下来完成栈和队列的操作 1. 栈 : 先进后出的线性表 应用 : 常见...

  • 链表

    线性表 是具有 n 个相同类型元素 的有限 序列 ( n ≥ 0 ) 常见的线性表有 数组 链表 栈 队列 哈希表...

  • Java并发之阻塞队列

    队列 队列是先进先出(FIFO)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进...

  • 数据结构与算法(1)-顺序表

    线性表的介绍 线性表是一种常用的数据结构。在实际应用中,线性表都是以栈、队列、字符串、数组等特殊线性表的形式来使用...

  • 动态数组

    线性表 具有n个相同类型元素的有限序列(n>=0) a1是首节点 an是尾节点 常见的线性表 数组 链表 栈 队列...

  • 栈和队列—什么是栈

    栈和队列是两种重要的数据结构 从数据结构角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表操作的子...

  • 栈和队列—什么是队列

    栈和队列是两种重要的数据结构 从数据结构角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表操作的子...

网友评论

      本文标题:从0开始——线性表的应用:队列

      本文链接:https://www.haomeiwen.com/subject/yuscfqtx.html