【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
- 【C基础】队列的实现
- 链式队列的基础操作实现(C语言)
- 【C++】队列的实现
- 队列的C语言实现
- C语言队列的实现
- c语言队列的实现
- C链式队列的实现
- 队列的c语言实现
- c 实现的 循环队列
- 队列的C语言实现
- 队列的C语言实现
- 队列的实现C语言
- 队列的C语言实现
- 队列的C语言实现
- 队列的C语言实现
- 队列的c代码实现
- C++:队列的类实现
- 循环队列的基础操作(C++)
- centos6.5配置FTP站点vsftpd的问题
- Leetcode_66_Plus One
- ffmpeg_doc(二)decoding_encodeing.c
- lucene自定义过滤器Filter
- uva-122 树的层次遍历
- 【C基础】队列的实现
- 【UNIX】什么是进程间FIFO通信以及信号通信
- const 在c和c++中的区别
- ViewPager + Fragment 滑动
- ORACLE ERP各模块会计分录
- [leetcode]Reverse Nodes in k-Group
- NYOJ 搜索题目汇总列表
- XML和HTML的区别和联系
- php post数据过程中的转义字符与urlencode编码