• 对队列的操作和算法


    一、队列的定义

    队列(queue)是一种先进先出的线性表。它只允许在表的一端进行插入,而在另一端删除元素。

    允许插入的一端叫做队尾(rear),允许删除的一端则称为对头(front)。

    队列一般也分为两种:

    链式队列:用链表实现;

    静态队列:用数组实现(静态队列通常都必须是循环队列)。

    一般用循环队列比较多,这里也只是讲述循环队列。


    二、循环队列需要弄清楚的几个问题

    1、静态队列为什么必须是循环队列

    答:因为无论是入队还是出队,rear和front都只能加不能减,如果用传统意义的数组实现队列,比front元素下标小的数组空间就浪费了。


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

    答:循环队列需要2个参数,front和rear


    3、循环队列各个参数的含义

    (1)队列初始化时,front和rear值都为零;

    (2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置;

    (3)当队列为空时,front与rear的值相等,但不一定为零;


    4、循环队列入队的伪算法

    (1)把值存在rear所在的位置;

    (2)rear=(rear+1)%maxsize ,其中maxsize代表数组的长度;


    4、循环队列出队的伪算法

    (1)先保存出队的值;

    (2)front=(front+1)%maxsize ,其中maxsize代表数组的长度;


    5、如何判断循环队列是否为空
    if(front==rear)
    队列空;
    else
      队列不空;


    6、如何判断循环队列是否为满

     这个问题比较复杂,假设数组的存数空间为7,此时已经存放六个元素了,如果在往数组中添加一个元素,则rear=front;此时,队列满与队列空的判断条件front=rear相同,这样的话我们就不能判断队列到底是空还是满了;

    解决这个问题有两个办法:

    一是增加一个参数,用来记录数组中当前元素的个数;

    二是少用一个存储空间,也就是数组的最后一个存数空间不用,当(rear+1)%maxsiz=front时,队列满。

    一般用第二种方法。


    三、用C语言实现

    关于循环队列的结构,可以参考严蔚敏的《数据结构》,那里讲得比较清楚。

    /*
    	2016年9月18日20:31:06
    	循环队列
    */
    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
    
    #define MAXQSIZE 6     //最大队列长度
    
    typedef struct Queue
    {
    	int * pBase;    //用来储存数组的首地址
    	int front;      //队头,因为是用数组实现,所以可以不用指针
    	int rear;       //队尾
    } QUEUE, * PQUEUE;
    
    //函数声明
    void init_queue(PQUEUE pQ);
    bool en_queue(PQUEUE pQ, int val);
    bool out_queue(PQUEUE pQ, int *val);
    void traverse_queue(PQUEUE pQ);
    bool is_full(PQUEUE pQ);
    bool is_empty(PQUEUE pQ);
    
    int main(void)   //主函数主要用来测试各个函数的正确性,并无实际用途
    {
    	QUEUE Q;
    	int val;
    
    	init_queue(&Q);    //初始化队列
    	en_queue(&Q, 1);
    	en_queue(&Q, 2);
    	en_queue(&Q, 3);
    	en_queue(&Q, 4);
    	en_queue(&Q, 5);
    	out_queue(&Q, &val);
    	en_queue(&Q, 6);
    	en_queue(&Q, 7);
    	traverse_queue(&Q);
    	
    	return 0;
    }
    
    void init_queue(PQUEUE pQ)   //初始化队列
    {
    	//构造一个空队列
    	pQ->pBase = (int *)malloc(sizeof(int) * MAXQSIZE);     //动态分配一块内存给数组
    	if(NULL == pQ->pBase)
    	{
    		printf("内存分配失败,程序终止!
    ");
    		exit(-1);
    	}
    	
    	pQ->front = pQ->rear = 0;  
    	
    	return;
    }
    
    bool is_full(PQUEUE pQ)   //判断队列是否满
    {
    	if((pQ->rear+1) % MAXQSIZE == pQ->front)
    		return true;
    	else 
    		return false;
    }
    
    bool is_empty(PQUEUE pQ)   //判断队列是否满
    {
    	if(pQ->rear == pQ->front)
    		return true;
    	else 
    		return false;
    }
    
    void traverse_queue(PQUEUE pQ)    //遍历输出
    {
    	int i = pQ->front;
    	
    	while(pQ->rear != i)
    	{
    		printf("   %d    ", pQ->pBase[i]);
    		i = (i+1) % MAXQSIZE;
    	}
    	printf("
    ");
    	
    	return;
    }
    
    bool en_queue(PQUEUE pQ, int val)   //入队
    {
    	if(is_full(pQ))
    	{
    		return false;
    	}
    	else
    	{
    		pQ->pBase[pQ->rear] = val;
    		pQ->rear = (pQ->rear+1) % MAXQSIZE;
    		
    		return true;
    	}
    }
    
    bool out_queue(PQUEUE pQ, int *pVal)  //出队
    {
    	if(is_empty(pQ))
    	{
    		return false;
    	}
    	else
    	{
    		*pVal = pQ->pBase[pQ->front];
    		pQ->front = (pQ->front + 1) % MAXQSIZE;
    		
    		return true;
    	}
    }
    
    


  • 相关阅读:
    vue3.0中如何使用ueditor
    如何在vue+element中实现选择框和穿梭框的根据拼音以及拼音首字母以及汉字的模糊搜索
    select 使其默认选中文本不为空
    java环境配置
    amaze ui 滚动监听
    vue项目中如何使用less
    强大的css3库
    input type file兼容性
    select中想要加a链接 并且新窗口打开
    echarts绘制k线图为什么写candlestick类型就报错
  • 原文地址:https://www.cnblogs.com/yzy-blogs/p/6597330.html
Copyright © 2020-2023  润新知