【C基础】队列的实现

来源:互联网 发布:则知明而行无过矣的知 编辑:程序博客网 时间:2024/05/16 04:51

队列模块的接口:

#include <stdlib.h>#define QUEUE_TYPE int  /* 队列元素的类型 */void create_queue( size_t size ); /* 创建一个队列,参数指定队列可以存储的元素的最大数量 */                                  /* 注意:这个函数只适用于使用动态分配数组的队列 */                                void destroy_queue( void ); /* 注意:这个函数只适用于链式和动态分配数组的队列 */void insert( QUEUE_TYPE value ); /* 添加新元素 */void delete( void ); /* 移除一个元素并将其丢弃 */QUEUE_TYPE first( void ); /* 返回队列中第一个元素的值,但不修改队列本身 */int is_empty( void ); /* 判断队列是否为空 */int is_full( void ); /* 判断队列是否已满 */

 

用静态数组实现队列:

#include "queue.h"#include <stdio.h>#include <assert.h>#define QUEUE_SIZE 100 /* 队列中元素的最大数量 */#define ARRAY_SIZE ( QUEUE_SIZE + 1 ) /* 数组的长度 */、/* 用于存储队列元素的数组和指向队列头和尾的指针 */static QUEUE_TYPE queue[ ARRAY_SIZE ];static size_t front = 1;static size_t rear = 0;/* insert */void insert( QUEUE_TYPE value ){    assert( !is_full() );    rear = ( rear + 1 ) % ARRAY_SIZE;    queue[ rear ] = value;}/* delete */void delete( void ){    assert( !is_empty() );    front = ( front + 1 ) % ARRAY_SIZE;}/* first */QUEUE_TYPE first( void ){    assert( !is_empty() );    return queue[ front ];}/* is_empty */int is_empty( void ){    return ( rear + 1 ) % ARRAY_SIZE == front;}/* is_full */int is_full( void ){    return ( rear + 2 ) % ARRAY_SIZE == front;}

 

动态数组实现队列:

#include "queue.h"#include <stdio.h>#include <assert.h>static QUEUE_TYPE *queue;static size_t queue_size;static size_t front = 1;static size_t rear = 0;void create_queue( size_t size ){    assert( queue_size == 0 );    queue_size = size;    queue = (QUEUE_TYPE*)malloc( queue_size * sizeof( QUEUE_TYPE ) );    assert( queue != NULL );}void destroy_queue( void ){    assert( queue_size > 0 );    queue_size = 0;    free( queue );    queue = NULL;}/*resize_stack函数,这个函数接收一个参数:堆栈的新长度 */void resize_queue( size_t new_size ){    QUEUE_TYPE *old_queue;    int i;    int rear_plus_one;        /* 确保空间足够大来保证数据在队列中,然后把指针保存到旧的数组中并创建一个新的 */    if( front <= rear )        i = rear – front + 1;    else         i = queue_size – front + rear + 1;    i %= queue_size;    assert( new_size >= i );    old_queue = queue;    queue = (QUEUE_TYPE*)malloc( new_size * sizeof( QUEUE_TYPE ) );    assert( queue != NULL );    queue_size = new_size;        /*把旧数组的值复制到新数组中,然后释放旧数组的内存*/    i = 0;    rear_plus_one = ( rear + 1 ) % queue_size;    while( front != rear_plus_one)    {        queue[ i ] = old_queue[ front ];        front = ( front + 1 ) % queue_size;         i += 1;    }    front = 0;    rear = ( i + queue_size – 1 ) % queue_size;    free( old_queue );}void insert( QUEUE_TYPE value ){    assert( !is_full() );    rear = ( rear + 1 ) % queue_size;    queue[ rear ] = value;}void delete( void ){    assert( !is_empty() );    front = ( front + 1 ) % queue_size;}QUEUE_TYPE first( void ){    assert( !is_empty() );    return queue[ front ];}int is_empty( void ){    assert( queue_size > 0 );    return( rear + 1 ) % queue_size == front;}int is_full( void ){    assert( queue_size > 0 );    return( rear + 2 ) % queue_size == front;}


用链表实现队列:

#include "queue.h"#include <stdio.h>#include <assert.h>/* 定义一个结构来保存一个值,link字段将指向队列中的下一个节点 */typedef struct QUEUE_NODE{    QUEUE_TYPE value;    struct QUEUE_NODE *next;}QueueNode;/* 指向队列第一个和最后一个节点的指针 */static QueueNode *front;static QueueNode *rear;/* destroy_queue */void destroy_queue( void ){    while( !is_empty() )        delete();}/* insert */void insert( QUEUE_TYPE value ){    QueueNode *new_node;    /* 分配一个新节点,并填充它的各个字段 */    new_node = ( QueueNode *)malloc( sizeof( QueueNode ) );    assert( new_node != NULL );    new_node -> next = NULL;    /* 把它插入到队列的尾部 */    if( rear == NULL )    {        front = new_node;    }    else    {        rear -> next = new_node;    }    rear = new_node;}/* delete */void delete( void ){    QueueNode *next_node;    /* 从队列的头部开始删除一个节点,如果它是最后一个节点,将rear置为NULL */    assert( !is_empty() );    next_node = front -> next;    free( front );    front = next_node;    if( front == NULL )        rear = NULL;}/* first */QUEUE_TYPE first( void ){    assert( !is_empty() );    return front -> value;}/* is_empty() */int is_empty( void ){    return front == NULL;}/* is_full() */int is_full( void ){   return 0;}



 

 

0 0
原创粉丝点击