数据结构与算法(4)--队列

来源:互联网 发布:仿内涵段子源码 编辑:程序博客网 时间:2024/06/08 00:38

队列

线性结构的两种应用:栈和堆   

栈和堆表示的是分配内存的方式不同
静态 是以出栈压栈的方式分配内存的  
动态内存是以一种堆排序的方式分配内存的
静态内存在栈中分配,动态内存在堆中分配(如double *q=(double *) malloc(200))
(q是静态分配的,在栈里分配的;200字节是动态分配的,是在堆里分配的)。
在栈里分配的是系统自动帮忙分配的,在堆里分配的是程序员手动分配的

栈   定义: 
                一种可以实现“先进后出”的存储结构(凡是满足这一特点的就是栈存储)
分类:
          静态栈
          动态栈
算法:
         压栈
         出栈
应用:
        函数调用
        中断
        表达式求职
        内存分配
        缓冲处理
        迷宫


队列  定义:一种可以实现“先进先出”的存储结构
         
         分类:链式队列(用链表实现)
                    
                    静态队列(用数组实现)     静态队列通常都必须是循环队列
        
        循环队列的讲解:
                                1、静态队列为什么必须是循环队列
                                2、循环队列需要几个参数来确定


                                3、循环队列各个参数的含义
                             (1)队列初始化
                                        font个rear的值都是零
                             (2)队列非空
                                        font代表的是队列的第一个元素
                                        rear代表的是队列的最后一个有效的元素的下一个元素
                             (3)font和rear的值相等,但不一定是零


                                4、循环队列入队伪算法讲解
                                5、循环队列出队伪算法讲解
                                6、如何判断循环你队列是否为空
                                7、如何判断循环队列是否已满
                                预备知识:
                                front的值可能比rear大
                                front的值可能比rear小
                                front的值也可能与rear相等
               
                                判断方法:
                                (1)、多用一个标识参数
                                (2)、少用一个元素空间(队列满的条件:(rear+1)%QueueSize==front)


                                 8、通用的计算队列长度公式为:(rear-front+QueueSize)%QueueSize


                                       入队(r 向后移一个) 伪算法:
                                 (1)、将值存入r所代表的位置
                                 (2)、正确写法:r=(r+1)%数组的长度

                                         错误写法:r=r+1


#include<stdio.h>           /*以数组为内核,实现队列的基本功能*/#include<malloc.h>typedefstruct Queue{int * pBase;int front;int rear;}QUEUE;void init(QUEUE *);            //初始化 bool en_queue(QUEUE *,int val);//入队    QUEUE * :往哪个队列放入,val:放入的值void traverse_queue(QUEUE *);  //遍历队列bool full_queue(QUEUE * pQ);bool out_queue(QUEUE * pQ,int * pVal);   //元素出队int main(){QUEUE Q;init(&Q);int val;en_queue(&Q,1);en_queue(&Q,2);en_queue(&Q,3);en_queue(&Q,4);en_queue(&Q,5);en_queue(&Q,6);traverse_queue(&Q);       if(out_queue(&Q, &val)){printf("出队成功,出队的元素是:%d\n",val);       }       else{printf(" 出队失败");   }return 0;}void init(QUEUE *pQ){pQ->pBase=(int *)malloc (sizeof(int )* 6); //先创建一个数组,将pBase当做数组的首地址pQ->front=0;pQ->rear=0;}bool en_queue(QUEUE * pQ,int val){      if(full_queue(pQ)==true){return false;}else{pQ->pBase[pQ->rear ]=val;pQ->rear=(pQ->rear+1)%6;    //pQ->rear在队列中的位置return true;}}bool full_queue(QUEUE * pQ){     if(((pQ->rear)+1)%6==pQ->front){printf(" 已满\n");return true; }     else{printf(" 未满\n");return false; }}void traverse_queue(QUEUE * pQ){int i=pQ->front;while(i!=pQ->rear){printf("%d\n",pQ->pBase[i]);i++;i=(i+6)%6;}}bool emput_queue(QUEUE * pQ){if(pQ->front==pQ->rear){return false;}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 true;}}


0 0
原创粉丝点击