队列

作者: 漫游之光 | 来源:发表于2018-09-12 21:00 被阅读0次

——主要参考了中国大学MOOC数据结构课程的内容
队列(Queue):具有一定操作约束的线性表——只能在一端插入,而在另一端删除。
类型名称:队列(Queue)
数据对象集:一个有0个或多个元素的有穷线性表。
操作集:长度为MaxSize的队列Q∈Queue,队列元素item∈ElementType

  1. Queue CreatQueue( int MaxSize ):生成长度为MaxSize的空队列;
  2. int IsFullQ( Queue Q, int MaxSize ):判断队列Q是否已满;
  3. void AddQ( Queue Q, ElementType item ): 将数据元素item插入队列Q中;
  4. int IsEmptyQ( Queue Q ): 判断队列Q是否为空;
  5. ElementType DeleteQ( Queue Q ):将队头数据元素从队列中删除并返回。

队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front以及一个记录队列尾元素位置的变量rear组成。下面是具体的代码:

#include<stdio.h>
#define MAX 10

typedef struct NQueue* Queue; 
struct NQueue{
    int array[MAX];
    int front;
    int rear;
};

Queue createQueue(){
    Queue queue = (Queue)malloc(sizeof(struct NQueue));
    queue->front = 0;
    queue->rear = 0;
    return queue;
}

void insert(Queue queue,int data){
    if((queue->rear+1)%MAX == queue->front){
        printf("队列满!");
        return;
    }
    queue->array[(++queue->rear)%MAX] = data;
}

int del(Queue queue){
    if(queue->rear%MAX == queue->front){
        printf("队列空!");
        return -1;
    }
    return queue->array[(++queue->front)%MAX];
}

int main(){
    Queue queue = createQueue();
    int i;
    for(i=0;i<10;i++){
        insert(queue,i);
    }
    for(i=0;i<10;i++){
        printf("%d ",del(queue));
    }
    free(queue);
    return 0;
} 

这个程序怎么说呢,简单,但是有一些值得注意的地方,第一个就是用数组循环存储的时候,要区分满和空这两种情况。如果都是从0到n-1,就不能,因为队列一共有n+1中情况。解决的办法就是增加标记,或者只使用n-1个位置。这里就是采用了第二种方法。

#include<stdio.h>
typedef struct node* Node;
typedef struct QNode* Queue;

struct node {
    int data;
    struct node* next;
};

struct QNode {
    struct node* front;
    struct node* rear;
};

Node createNode(int data) {
    Node node = (Node)malloc(sizeof(struct node));
    node->data = data;
    node->next = NULL;
    return node;
}

Queue createQueue() {
    Queue queue = (Queue)malloc(sizeof(struct QNode));
    queue->front = NULL;
    queue->rear = NULL;
    return queue;
}

void insert(Queue queue,int data) {
    if(queue->rear == NULL) {
        queue->rear = createNode(data);
        queue->front = queue->rear;
    } else {
        queue->rear->next = createNode(data);
        queue->rear = queue->rear->next;
    }
}

int del(Queue queue) {
    if(queue->front == NULL) {
        printf("队列空!");
        return -1;
    }
    Node node;
    node = queue->front;
    int data = node->data;
    if(queue->front == queue->rear) {
        queue->front=NULL;
        queue->rear =NULL;
    } else {
        queue->front = node->next;
    }
    free(node);
    return data;

}

int main() {
    Queue queue = createQueue();
    int i;
    for(i=0; i<10; i++) {
        insert(queue,i);
    }
    for(i=0; i<11; i++) {
        printf("%d ",del(queue));
    }
    free(queue);
    return 0;
}

这个相对来说,还是比较容易的。
PS:今天不知怎么了,竟然出现了两次把赋值和等于弄混了,结果自然很悲剧,检查了十几分钟,才发现这么一个低级的错误。

相关文章

  • 队列

    队列特性 对比队列和栈 基于数组的队列 对比队列学习循环队列 循环队列难点 阻塞队列 并发队列 应用:线程池中拒绝...

  • 队列

    文章结构 什么是队列 实现队列顺序队列链式队列循环队列 Java中的队列 1. 什么是队列 队列也是一种操作受限的...

  • iOS底层-- GCD源码分析(1)-- dispatch_qu

    手动目录认识队列队列的结构队列的产生主队列全局队列创建的队列管理队列 代码版本dispatch version :...

  • 队列,异步,同步,线程通俗理解

    一、队列 串行队列 并行队列 主队列(只在主线程执行的串行队列) 全局队列(系统的并行队列) 二、 任务(是否具有...

  • GCD基础总结一

    上代码~ 同步串行队列 同步并行队列 异步串行队列 异步并行队列 主队列同步 会卡住 主队列异步

  • OC多线程

    队列创建 线程与队列 队列线程间通信 队列组

  • GCD

    获得主队列 获得全局队列 串行队列 异步队列 同步队列 阻隔队列 (像栅栏一样 ) 例如 A -->栅栏 --...

  • 数据结构第三篇 队列

    队列的特性 前进先出。 我们来大致描述下进出队列的情况。 进队列 1 进队列现在队列是 12 进队列现在队列是 1...

  • 利用链表实现队列

    队列成员变量: 队列长度 队列头节点 队列尾节点队列方法: 队列包含元素个数 队列是否为空 进队操作 出队操作 d...

  • Git 常用操作命令(持续更新)

    当前更新到stash队列 查看stash队列 清空队列 删除某个队列

网友评论

      本文标题:队列

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