C 循环队列实现

一个循环队列的C语言实现,数据类型Queue定义如下,注意在 typedef struct{...}Queue; 中Queue为数据类型,而在struct {...}Queue; 中Queue为一个变量名。

front 为队首元素下标,始终指向队首元素,tail 为队尾元素的下一个位置的下标。初始状态为front=tail=0

typedef struct {
    int size,eleNum;
    int* array;
    int front,tail;  //front指向第一个元素,rear指向最后一个元素的下一个位置
} Queue;

基本操作有:

add(), 添加元素到队尾

peek(), 获取但并不移出头

poll(), 获取并移出队首元素

create(n), 创建大小为n的队列

isempty(), 判断队列是不是空

另外,队列操作函数的参数都为指针,这样可以实现模拟引用传递的效果,如果参数为add(Queue q,int n), 对队列的修改并不会影响到初始的队列。可以修改运行试一下。

代码实现如下:


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

    /*用c语音实现队列基本操作
    add(), 添加元素到队尾
    peek(), 获取但并不移出头
    poll(), 获取并移出队首元素
    create(n), 创建大小为n的队列
    isempty(), 判断队列是不是空
    */

    typedef struct {
        int size,eleNum;
        int* array;
        int front,tail; //front指向第一个元素,rear指向最后一个元素的下一个位置
    } Queue;

    //取出并移除第一个元素
    int poll(Queue* q){
        int res = q->array[q->front];
        q->front = (++(q->front))%q->size;
        q->eleNum--;
        return res;
    }

    //获取长度
    int len(Queue* q){
        return q->eleNum;
    }

    //插入k,返回1表示插入成功
    int add(Queue* q,int k){
        if(q->size==q->eleNum){
            return 0;
        }
        q->eleNum++;
        q->array[q->tail] = k;
        q->tail = (q->tail+1) % q->size;

        return 1;
    }

    //取出头部元素,不删除此元素,peek是“偷看”的意思
    int peek(Queue* q){
        return q->array[q->front];
    }

    //返回1表示为空,0表示不空
    int isEmpty(Queue* q){
        if(q->eleNum==0){
            return 1;
        }
        return 0;
    }

    //创建大小为n的队列
    Queue* createQue(int n){

        Queue* que = (Queue*)malloc(sizeof(Queue));
        que->size = n;
        que->eleNum = 0;
        que->array = (int*)malloc(sizeof(int)*n);
        que->front = 0;
        que->tail = 0;

        return que;
    }

    void display(Queue* q){
        int i = q->front;
        printf("elements: ");
        while(i!=q->tail){
            printf("%d ",q->array[i]);
            i = (i+1)%q->size;
        }
        printf("\n");
        printf("size: %d,elements num: %d\n",q->size,q->eleNum);
        printf("front: %d, tail:%d \n",q->front,q->tail);
    }

    int main(){

        Queue* q = createQue(10);

        add(q,10); add(q,11); add(q,12);
        poll(q); poll(q);
        display(q);

        return EXIT_SUCCESS;
    }
时间: 2024-11-09 19:09:27

C 循环队列实现的相关文章

数据结构之循环队列c语言实现

    队列是一种先入先出的结构,数据从队列头出,队尾进.在linux内核中进程调度,打印缓冲区都有用到队列.     队列有多种实现方式,可以用链表,也可以用数组.这里用数组来实现一个简单的循环队列.首先创建一个大小为8的队列如下,队列头尾指针指向同一块内存,          当从队列尾部插入一个数据后变成下面的情形,为了便于处理,这里始终会浪费一个空间 继续插入数据,直到出现以下情形,表示队列满了, 接下来看一下出队的情形,从队列头出队3个元素, 再添加三个元素后队列又变成满的了, 在上面

47 _ 循环队列程序演示.swf

通过上面的分析我们已经对循环队列很了解了,现在我们来学习下循环队列的实现形式 1.代码使用数组现实循环队列 #include<stdio.h> #include<malloc.h> #include <stdio.h> #include <stdlib.h> typedef struct Queue{ int * data;//存储的数据,指向一个数组 int font ;//队列数据删除 int rear;//队列数据的添加 }QUEUE ,*PQUEUE

多线程与循环队列

多线程使用循环队列其实也不是个很难的东西,在工作中遇到了一个队列行为非常古怪,怎么也想不通,一直都没有认证对待这些,有点怵,所以这回想认真对待一下. 多线程使用循环队列主要就是要避免两个线程同时操作队列,加个锁就可以很容易的实现,win32中用临界区就可以做到. 代码: // CirQueue.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <Wi

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

每日一题19:循环队列

基于数组实现的循环队列,这个比基于链表实现的稍微麻烦一点,需要浪费一个存储空间.如果全部利用,则编程将会变得更加繁琐,并且更容易出错. // LoopQueue.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; struct loop_queue { int capacity; int head; int tail; int *vals; }; loop_

(一)循环队列

队列可以使用数组或者链表实现,这里介绍一种使用数组实现的循环队列. 所谓循环队列,是指当尾指针超过数组索引界限时,通过取余运算返回数组起始端,只要保证尾指针和头指针不相遇,就可以继续存储元素. 首先设定队列的大小,并建立队列结构体: #define MAXSIZE 100001 typedef struct { int items[MAXSIZE]; int front; int rear; }Queue; 设头指针和尾指针指向同一索引时队列为空,起始时均在索引0处. void initQueu

hdu 1175 连连看(模拟循环队列)

连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18149    Accepted Submission(s): 4741 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条

数据结构6_顺序队列(循环队列)

本文实现了顺序队列,与链队列不同的是,顺序队列需要考虑一个问题, 问题情况如下, 解决办法:循环队列,当rear到分配的数组空间末尾时,转到数组头 但是当q.rear==q.front时,又如何区分一种是空队列,一种是满队列的情况呢 这里有两种方案 本次代码实现了第一种方法,同时设置了一个技术变量length,稍加改动便可实现第二个方法 代码如下: #include<iostream>using namespace std;//该顺序队列为循环队列,解决队尾指针达到最大值,队列中有空闲单元,但

09.循环队列与链队列

一.队列与循环队列 1.队列 (1)队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表.队列是一种先进先出(Fiirst In First Out)的线性表,简称FIFO.允许插入的一端称为队尾,允许删除的一端称为队头. 从队列的定义可知,队列的入队操作,其实就是在队尾追加一个元素,不需要移动任何元素,因此时间复杂度为O(1).队列的删除操作,与栈不同的是,队列元素的出列是在队头,即小标为0的位置,若要删除一个元素的话,需要移动队列的所有元素,因此事件复杂度为O(n).

循环队列的一种实现模型

前段时间在知乎上看到这样一个小题目: 用基本类型实现一队列,队列要求size是预先定义好的的.而且要求不可以使用语言自带的api,如C++的STL.普通的实现很简单,但是现在要求要尽可能的时间和空间复杂度的优化,要和语言自带的api比较时间和空间.这个队列还要支持如下的操作: constructor: 初始化队列 enqueue:入队 dequeue:出队 队列是一种基本的数据结构,在平常的应用中十分广泛,多数情况队列都是用链表实现的.但是对于本题而言,用链表实现就有这样一个问题:由于每个结点都