码迷,mamicode.com
首页 > 其他好文 > 详细

queue

时间:2017-09-06 23:54:58      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:队列   str   putc   define   head   链表   ++   col   enqueue   

queue是一种先进先出的数据结构。以下由简入繁引入queue。

queue的操作主要有:入队,出队,空满判断等。

1. 数组实现简单队列

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

#define MAX 10
int arr[MAX];
int head = 0;
int tail = 0;
int counter = 0;

void enqueue(int value)
{
    arr[tail ++] = value;
}

int dequeue(void)
{
    return arr[head ++];
}

bool is_empty(void)
{
    return head == tail;
}

bool is_full(void)
{
    return tail == MAX;
}

int main(int argc, char *argv[])
{
    char ch;

    while((ch = getchar()) != \n) {
        if (! is_full()) {
            enqueue(ch);
        }
    }
    while(! is_empty()) {
        putchar(dequeue());
    }

    return 0;
}

2. 数组实现循环队列

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

#define MAX 10
int arr[MAX];
int head = 0;
int tail = 0;
int counter = 0;

void enqueue(int value)
{
    counter ++;
    arr[tail] = value;
    tail = (tail + 1) % MAX;
}

int dequeue(void)
{
    int data;
    counter --;
    data = arr[head];
    head = (head + 1) % MAX;
    return data;
}

bool is_empty(void)
{
    return counter == 0;
}

bool is_full(void)
{
    return counter == MAX;
}

int main(int argc, char *argv[])
{
    char ch;

    while((ch = getchar()) != \n) {
        if (! is_full()) {
            enqueue(ch);
        }
    }
    while(! is_empty()) {
        putchar(dequeue());
    }

    return 0;
}

3. 链表实现队列

// queue.h
#ifndef _QUEUE_H_
#define _QUEUE_H_

#include <stdbool.h>

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

typedef struct {
    struct node *head;
    struct node *tail;
} Queue;

extern void queue_init(Queue *queue);
extern void queue_destroy(Queue *queue,
        void (*destroy)(void *data));

extern void queue_enqueue(Queue *queue, void *data);
extern void *queue_dequeue(Queue *queue);

extern bool queue_is_full(Queue *queue);
extern bool queue_is_empty(Queue *queue);

#endif    //_QUEUE_H_
#include <stdlib.h>
#include <assert.h>

#include "queue.h"

void queue_init(Queue *queue)
{
    queue->head = NULL;
    queue->tail = NULL:    
}
void queue_destroy(Queue *queue,
        void (*destroy)(void *data))
{
    while(! queue_is_empty(queue)) {
        if (destroy) {
            destroy(queue_dequeue(queue));
        } else {
            queue_dequeue(queue);
        }
    }
}

static struct node * make_node(void *data)
{
    struct node *n;

    n = malloc(sizeof(struct node));
    assert(n);
    n->data = data;
    n->next = NULL;

    return n;
}

void queue_enqueue(Queue *queue, void *data)
{
    struct node *n;

    n = make_node(data);

    if (queue->head == NULL) {
        queue->head = n;
        queue->tail = n;
    } else {
        queue->tail->next = n;
        queue->tail = n;
    }
}

void *queue_dequeue(Queue *queue)
{
    void *data;
    struct node *n;

    n = queue->head;
    data = n->data;
    queue->head = n->next;
    free(n);
    return data;
}

bool queue_is_full(Queue *queue)
{
    return false;
}
bool queue_is_empty(Queue *queue)
{
    return queue->head == NULL;
}

 

queue

标签:队列   str   putc   define   head   链表   ++   col   enqueue   

原文地址:http://www.cnblogs.com/embedded-linux/p/7487457.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!