• 顺序队列的模板


    ///page61操作,非链式,顺式
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define INFEASIBLE -1
    #define OVERFLOW -2
    typedef  int elemtype;
    typedef int status;
     #define MAXQSIZE 5 // 最大队列长度(对于循环队列,最大队列长度要减1)
     struct squeue  {
       elemtype *base; // 初始化的动态分配存储空间
       int head; // 头指针,若队列不空,指向队列头元素
       int tail; // 尾指针,若队列不空,指向队列尾元素的下一个位置
     };
     status InitQueue(squeue &Q)  { // 构造一个空队列Q
       Q.base=(elemtype *)malloc(MAXQSIZE*sizeof(elemtype));
       if(!Q.base) // 存储分配失败
         exit(OVERFLOW);
       Q.head=Q.tail=0;
       return OK;
     }
     status DestroyQueue(squeue &Q)  { // 销毁队列Q,Q不再存在
        if(Q.base)
         free(Q.base);
        Q.base=NULL;
        Q.head=Q.tail=0;
        return OK;
     }
     status ClearQueue(squeue &Q) { // 将Q清为空队列
       Q.head=Q.tail=0;
       return OK;
     }
     status QueueEmpty(squeue Q)  { // 若队列Q为空队列,则返回TRUE,否则返回FALSE
       if(Q.head==Q.tail) // 队列空的标志
         return TRUE;
       else
         return FALSE;
     }
     int QueueLength(squeue Q){ // 返回Q的元素个数,即队列的长度
       return(Q.tail-Q.head);
     }
     status GetHead(squeue Q,elemtype &e) { // 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR
       if(Q.head==Q.tail) // 队列空
         return ERROR;
       e=*(Q.base+Q.head);
       return OK;
     }
    
     status EnQueue(squeue &Q,elemtype e) { // 插入元素e为Q的新的队尾元素
       if(Q.tail>=MAXQSIZE) { // 队列满,增加1个存储单元
         Q.base=(elemtype *)realloc(Q.base,(Q.tail+1)*sizeof(elemtype));
         if(!Q.base) // 增加单元失败
           return ERROR;
       }
       *(Q.base+Q.tail)=e;
       Q.tail++;
       return OK;
     }
    
     status DeQueue(squeue &Q,elemtype &e){ // 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR
       if(Q.head==Q.tail) // 队列空
         return ERROR;
       e=Q.base[Q.head];
       Q.head=Q.head+1;
       return OK;
     }
     void vi(elemtype e){
        printf("%d ",e);
    
     }
     status QueueTraverse(squeue Q,void(*vi)(elemtype))  { // 从队头到队尾依次对队列Q中每个元素调用函数vi()。一旦vi失败,则操作失败
       int i;
       i=Q.head;
       while(i!=Q.tail){
         vi(*(Q.base+i));
         i++;
       }
       printf("
    ");
       return OK;
     }
     status print(squeue Q){//同样输出队列
          for(int i=Q.head;i<Q.tail;i++)
            printf("%d ",Q.base[i]);
          printf("
    ");
     }
      int main(){
          squeue q;
          InitQueue(q);
          elemtype e;
          for(int i=5;i<=10;i++){
            EnQueue(q,i);
          }
          printf("%d
    ",QueueLength(q));
          GetHead(q,e);
          printf("%d
    ",e);
          DeQueue(q,e);
          QueueTraverse(q,vi);//输出队列标准方法
                print(q); //输出队列简单方法
    
          return 0;
      }
  • 相关阅读:
    DevExpress中设置PanelControl背景的方法
    ArcEngine选中面要素样式修改
    DEV winform treelist设置背景图像
    React-Native运行知乎日报遇到的问题
    winform程序自动升级
    jquery图片轮播效果(unslider)
    Orchard搜索与索引
    网络版会飞的小鸟
    jQuery event的复制粘贴的坑
    记一次有趣的互联网事件及console.log~
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/5037805.html
Copyright © 2020-2023  润新知