首页 > 代码库 > 队列。
队列。
用模运算可简化为:i=(i+1)%MAX_QUEUE_SIZE ;
和时间有关的操作都与队列有关。
队列的顺序存储结构FIFO
设立一个队首指针front ,一个队尾指针rear ,分别指向队首和队尾元素。
◆ 初始化:front=rear=0。
◆ 入队:将新元素插入rear所指的位置,然后rear加1。
◆ 出队:删去front所指的元素,然后加1并返回被删元素。
◆ 队列为空:front=rear。
◆ 队满:rear=MAX_QUEUE_SIZE-1或front=rear。
静态顺序队列
#define MAX_QUEUE_SIZE 100typedef struct queue{ ElemType Queue_array[MAX_QUEUE_SIZE] ; int front ; int rear ;}SqQueue;
循环队列
循环队列需要的参数:2个参数。front rear
初始化:front 和rear的值都是0
队列非空:front代表的是队列的第一个元素
rear代表队列的最后一个有效元素的下一个元素。
队列空:front和rear的值都相等,但不一定是0.
◆ rear所指的单元始终为空。
◆ 循环队列为空:front=rear 。
◆ 循环队列满:(rear+1)%MAX_QUEUE_SIZE =front。
循环队列的初始化
SqQueue Init_CirQueue(void){ SqQueue Q ; Q.front=Q.rear=0; return(Q) ;}
入队操作
伪算法:将值放在r所代表的位置/r指针移动,r=(r+1)%数组的长度
Status Insert_CirQueue(SqQueue Q , ElemType e) { if ((Q.rear+1)%MAX_QUEUE_SIZE== Q.front) return ERROR; Q.Queue_array[Q.rear]=e ; Q.rear=(Q.rear+1)% MAX_QUEUE_SIZE ; return OK; }
出队
f=(f+1)%数组的长度
Status Delete_CirQueue(SqQueue Q, ElemType *x ) /* 将循环队列Q的队首元素出队 */ { if (Q.front+1== Q.rear) return ERROR ; /* 队空,返回错误标志 */ *x=Q.Queue_array[Q.front] ; /* 取队首元素 */ Q.front=(Q.front+1)% MAX_QUEUE_SIZE ; /* 队首指针向前移动 */ return OK ;}
队列的链式表示和实现---它是限制仅在表头进行删除操作和表尾进行插入操作的单链表。
数据元素结点类型定义:
typedef struct Qnode{ ElemType data ; struct Qnode *next ;}QNode ;
指针结点类型定义:
typedef struct link_queue{ QNode *front , *rear ;}Link_Queue ;
⑴ 链队列的初始化
LinkQueue *Init_LinkQueue(void){ LinkQueue *Q ; QNode *p ; p=(QNode *)malloc(sizeof(QNode)) ; /* 开辟头结点 */ p->next=NULL ; Q=(LinkQueue *)malloc(sizeof(LinkQueue)) ; /* 开辟链队的指针结点 */ Q.front=Q.rear=p ; return(Q) ;}
(2) 链队列的入队操作---在已知队列的队尾插入一个元素e ,即修改队尾指针(Q.rear)。
Status Insert_CirQueue(LinkQueue *Q , ElemType e) /* 将数据元素e插入到链队列Q的队尾 */ { p=(QNode *)malloc(sizeof(QNode)) ; if (!p) return ERROR;/* 申请新结点失败,返回错误标志 */ p->data=http://www.mamicode.com/e ; p->next=NULL ; /* 形成新结点 */ Q.rear->next=p ; Q.rear=p ; /* 新结点插入到队尾 */ return OK;}
(3)链队列的出队操作
Status Delete_LinkQueue(LinkQueue *Q, ElemType *x){ QNode *p ; if(Q.front==Q.rear) return ERROR ; /* 队空 */ p=Q.front->next ; /* 取队首结点 */ *x=p->data ; Q.front->next=p->next ; /* 修改队首指针 */ if (p==Q.rear) Q.rear=Q.front ; /* 当队列只有一个结点时应防止丢失队尾指针 */ free(p) ; return OK ; }
(4)链队列的撤消
void Destroy_LinkQueue(LinkQueue *Q ) /* 将链队列Q的队首元素出队 */ { while(Q.front!=NULL) { Q.rear=Q.front->next; /* 令尾指针指向队列的第一个结点 */ free(Q.front); /* 每次释放一个结点 */ /* 第一次是头结点,以后是元素结点 */ Q.ront=Q.rear;}
队列。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。