zoukankan      html  css  js  c++  java
  • 队列的存储结构的实现(C/C++实现)

    存档

     1 #include "iostream.h"
     2 #include "stdlib.h"
     3 #define max 20
     4 typedef char elemtype;
     5 #include "queue.h"
     6 void main()
     7 {
     8     elemtype e;
     9     queue q;
    10     cout<<"(1)初始化队列q"<<endl;
    11     initqueue(q);
    12     cout<<"(2)队列为"<<(queueempty(q)?"":"非空")<<endl;
    13     cout<<"(3)依次输入字母序列,以'#'结束:"<<endl;
    14     cin>>e;
    15     while(e!='#')
    16     {
    17         enqueue(q,e);
    18         cin>>e;
    19     }
    20     cout<<"(4)队列为"<<(queueempty(q)?"":"非空")<<endl;
    21     e=dequeue(q);
    22     cout<<"(5a)出队一个元素dequeue()为:"<<e<<endl;
    23     if(dequeue1(q,e))
    24         cout<<"(5b)出队一个元素dequeue1()为:"<<e<<endl;
    25     cout<<"(6)队列q的元素个数:"<<queuelength(q)<<endl;
    26     cout<<"(7)清空队列"<<endl;
    27     clearqueue(q);
    28     cout<<"(8)队列q的元素个数:"<<queuelength(q)<<endl;
    29     cout<<"(9)字符abc依次入队列"<<endl;
    30     enqueue(q,'a');
    31     enqueue(q,'b');
    32     enqueue(q,'c');
    33     e=gethead(q);
    34     cout<<"(10a)队头元素gethead()为:"<<e<<endl;
    35     if (gethead1(q,e))
    36         cout<<"(10b)队头元素gethead1()为:"<<e<<endl;
    37     cout<<"(11)队列的元素个数:"<<queuelength(q)<<endl;
    38     cout<<"(12)所有元素出队列:";
    39     while(!queueempty(q))
    40         cout<<dequeue(q)<<" ";
    41     cout<<endl;
    42     cout<<"(13)队列q的元素个数:"<<queuelength(q)<<endl;
    43     cout<<"(14)释放队列"<<endl;
    44     destoryqueue(q);
    45 }
      1 typedef struct
      2 {
      3     elemtype *base;//动态分配存储空间
      4     int front;//头指针,若队列不空指向队列队头元素
      5     int rear;//尾指针,若队列不空指向队列队尾元素的下一个位置
      6 }queue;
      7 void initqueue(queue &q)
      8 {
      9     //初始化队列
     10     q.base=new elemtype[max];//分配存储空间
     11     if(!q.base)
     12     {
     13         cout<<"队列分配失败
    ";
     14         exit(-2);
     15     }
     16     else
     17         q.front=q.rear=0;//初始状态,front和rear都为0
     18 }
     19 void clearqueue(queue &q)
     20 {
     21     //清空队列,但不销毁
     22     q.front=0;//清空函数,恢复到初始状态
     23     q.rear=0;
     24 }
     25 int queueempty(queue q)
     26 {
     27     //判断队列是否为空
     28     if(q.front==q.rear)//空队列,返回1,否则返回0
     29         return 1;
     30     else
     31         return 0;
     32 }
     33 int queuelength(queue q)
     34 {
     35     //求队列中元素个数
     36     return (q.rear-q.front+max)%max;//计算队列当前存储的元素数目
     37 }
     38 void enqueue(queue &q,elemtype e)
     39 {
     40     //入队列操作
     41     if((q.rear+1)%max==q.front)//队满的操作
     42     {
     43         cout<<"队满,无法插入新元素!"<<endl;
     44         exit(-2);
     45     }
     46     else
     47     {
     48         q.base[q.rear]=e;//元素e存在当前rear所指位置
     49         q.rear=(q.rear+1)%max;//rear指针后移
     50     }
     51 }
     52 elemtype dequeue(queue &q)
     53 {
     54     //出队列操作
     55     if(q.front==q.rear)//空队列不能出队
     56     {
     57         //队空
     58         cout<<"空队列,无法删除头元素!"<<endl;
     59         exit(-2);
     60     }
     61     else
     62     {
     63         elemtype e=q.base[q.front];//当前的队列头元素作为返回值
     64         q.front=(q.front+1)%max;//front指针后移
     65         return e;
     66     }
     67 }
     68 int dequeue1(queue &q,elemtype &e)
     69 {
     70     //出队列操作
     71     if(q.front==q.rear)//空队列不能出队
     72     {
     73         //队空
     74         cout<<"空队列,无法删除头元素!"<<endl;
     75         return 0;
     76     }
     77     else
     78     {
     79         e=q.base[q.front];//当前的队列头元素作为返回值
     80         q.front=(q.front+1)%max;//front指针后移
     81         return 1;
     82     }
     83 }
     84 elemtype gethead(queue q)
     85 {
     86     //读队头元素的值,但不删除
     87     if(q.front==q.rear)//空队列,无法读
     88     {
     89         //队空
     90         cout<<"空队列,无头元素"<<endl;
     91         exit(-2);
     92     }
     93     else 
     94         return q.base[q.front];//队列头元素的数组下标即front本身
     95 }
     96 void destoryqueue(queue &q)
     97 {
     98     //销毁队列
     99     delete q.base;//释放连续的存储空间
    100     q.base=NULL;//基地址赋值为空
    101     q.front=0;//头指针赋值为0
    102     q.rear=0;//尾指针赋值为0
    103 }
    104 int gethead1(queue q,elemtype &e)
    105 {
    106     //读队头元素的值,但不删除
    107     if(q.front==q.rear)//空队列,无法读
    108     {
    109         //队空
    110         cout<<"空队列,无头元素"<<endl;
    111         return 0;
    112     }
    113     else 
    114         e=q.base[q.front];//队列头元素的数组下标即front本身
    115     return 1;
    116 }

    运行结果如下:

  • 相关阅读:
    Flink 的datastreamAPI 以及function函数的调用,性能调优
    Spark Shuffle原理、Shuffle操作问题解决和参数调优
    Spark学习之JavaRdd
    Redis学习笔记--Redis数据过期策略详解==转
    Elasticsearch 数据搜索篇·【入门级干货】===转
    HBase二级索引的设计(案例讲解)
    C中指针符*和取址符&
    java 中,如何获取文件的MD5值呢?如何比较两个文件是否完全相同呢?
    Mysql数据库的加密与解密
    Lucene 分词
  • 原文地址:https://www.cnblogs.com/ECJTUACM-873284962/p/7764174.html
Copyright © 2011-2022 走看看