数据结构5(自用)

本文详细介绍了队列的两种常见实现方式——链式队列和静态队列(循环队列),阐述了队列的“先进先出”特性,并重点解析了循环队列的工作原理、参数含义、入队和出队的伪代码以及判断队列状态的方法。此外,还提供了简单的C语言程序实例来演示队列操作。队列在各种时间相关操作中发挥着重要作用。
摘要由CSDN通过智能技术生成

线性结构的两种常见应用之二--------- 队列(一端入,另一端出)

定义:一种可以实现“先进先出”的存储结构

分类:链式队列:(内部是链表  头用front(上)表示,尾用rear(下)表示),删除的话从front开始,删除叫                                  出队,插入(入对)的话从rear;

           静态队列 :(用数组实现,从front(0(底部))到rear(6(顶部)),删除从front删,添                                 从rear添)。   静态队列通常都必须是循环队列(删减增加下标均加)

                               循环队列:1.静态队列为什么是循环队列?

                                                    答: 队列删减增加都是向上移动,底部空间若不加以利用会造成                                                              浪费

                                                 2.循环队列需要几个参数来确定?

                                                     答:front(第一个元素)与rear(最后一个元素的下一个)                                                             

                                                 3.循环队列各参数含义?

                                                   答:front(第一个元素)与rear(最后一个元素的下一个),这                                                               俩参数不同场合含义不同

                                                               1>队列初始化:两个都是0

                                                                2>队列非空:front:第一个元素,rear:最后一个元素                                                                       的下一个元素,

                                                                3>队列空:两个值相等,但不一定是0.

                                                  4.循环队列入队伪算法?

                                                      答:第一步:将值存入r所代表的位置,第二步:r 移动。

                                                            错误写法r  = r+1;

                                                             正确写法:r = (r+1)%len(数组长度)。

                                                  5.循环队列出队伪算法?

                                                      答: 第一步:先把要删的值保存起来。第二部:移动f

                                                             错误写法f = f+1;

                                                             正确写法:f = (f+1)%len(数组长度)。                                                 

                                                  6.怎样判断循环队列是否为空?

                                                      答:if  front ==rear,则该队列为空

                                                  7.怎么判断循环队列是否已满?

                                                       答:一个数组有n给元素,but只可以放n-1个;这样front与rear                                                                就不会相等

                                                               f!=1时:f ==(r+1)

                                                               f ==1时:r==len(数组长度)

                                                               if((r+1)%数组长度 == f)已满  ; else  不满

算法:入队/出队

具体应用:所有和时间有关的操作都有队列的影子。

注意:上一节,(栈、队列)和链表的区别是:(栈、队列) 是由pTop向Bottom指向,由上到下

           而链表是由前到后

程序:

#include<stdio.h>

#include<malloc.h>

struct Queue

{

 int * pBase;

int front;

int rear;

}QUEUE,*PQUEUE;

void init(QUEUE *);

bool en_queue(QUEUE *,int val);

void traverse_queue(QUEUE *);

bool full_queue(QUEUE *);

bool out_queue(QUEUE*, int* pVal);

bool emput_queue(QUEUE *pQ);

int main(void)

{

  Queue Q;

  init(Q);

  return 0;

  int val;

}  

void init(QUEUE *pQ)

{

 pQ->pBase = (int *)malloc(sizeof(int)*6);

 pQ->front = 0;

 pQ->rear = 0;

}

bool full_queue(QUEUE *pQ,int val)

{

 if((pQ->rear +1)%6 == pQ->front)

return true;

else 

return false;

}

bool en_queue(QUEUE *,int val);

{

 if(full_queue(pQ))

{

 return false;

}

else

{

 pQ->pBase[pQ->rear] = val;

pQ->rear = (pQ->rear +1)%6;

return ture;

}

}

void traverse_queue(QUEUE *);

{

 int i = pQ->front;

while(i!= pQ->rear)

{

  printf("%d", pQ->pBase[i]);

i = (i+1)%6;

}

printf("\n");

return;

}

bool emput_queue(QUEUE *pQ)

{

 if(pQ->front == pQ->rear)

return true;

else

return false;

}

bool out_queue(QUEUE*pQ, int* pVal);

{

 if(emput_queue(pQ))

{

 return false;

}

else

{

*pVal = pQ->pBase[pQ->front]

pQ->front = (pQ->front   + 1)%6;

return false;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值