zoukankan      html  css  js  c++  java
  • 队列的数组实现

      1 /*
      2   队列的数组实现。
      3   为避免出现队列“看似满了”现象,采用循环数组实现。
      4   当Size = 0 或 Rear = Front - 1 ,说明队列为空。
      5   要注意的是,插入的第一个元素的位置是Array[ 1 ],而不是Array[ 0 ]。
      6 */
      7 
      8 /*接口头文件*/
      9 typedef int ElementType;
     10 #ifndef _QUEUE_H
     11 #define _QUEUE_H
     12 #include <stdbool.h>
     13 
     14 struct Node;
     15 typedef struct Node * PtrToNode;
     16 typedef PtrToNode Queue;
     17 
     18 /*操作集*/
     19 Queue CreateQueue( int MaxElements );
     20 void MakeEmpty( Queue Q );
     21 bool IsEmpty( Queue Q );
     22 bool IsFull( Queue Q );
     23 void Enqueue( ElementType X, Queue Q );
     24 void Dequeue( Queue Q );
     25 ElementType Front( Queue Q );
     26 ElementType FrontAndDequeue( Queue Q );
     27 void DisposeQueue( Queue Q );
     28 void PrintfQueue( Queue Q );
     29 
     30 #endif 
     31 
     32 
     33 /*接口实现*/
     34 #include <stdio.h>
     35 #include <stdlib.h>
     36 #include "queue.h"
     37 
     38 /*获取下个队头或队尾,实现循环数组*/
     39 int Succ( int Value, Queue Q );
     40  
     41 /*指定队列数组的最小空间*/
     42 #define MinQueueSize ( 5 )
     43 
     44 /*特定结构体定义*/
     45 struct Node
     46 {
     47     int Capacity;         //队列数组空间大小
     48     int Size;             //队列元素个数
     49     int Front;            //队头
     50     int Rear;             //队尾
     51     ElementType * Array; 
     52 };
     53 
     54 /*创建队列*/
     55 Queue CreateQueue( int MaxElements )
     56 {
     57     Queue Q;
     58     
     59     if ( MaxElements < MinQueueSize )
     60     {
     61        printf( "Space is smallr!!!
    " );
     62        exit( 1 );
     63     }
     64     
     65     Q = ( Queue )malloc( sizeof( struct Node ) );
     66     if ( Q == NULL )
     67     {
     68        printf( "No Space!!!
    " );
     69        exit( 1 );
     70     }
     71     
     72     Q->Array = ( ElementType * )malloc( sizeof( ElementType ) * MaxElements );
     73     if ( Q->Array == NULL )
     74     {
     75        printf( "No Space!!!
    " );
     76        exit( 1 );
     77     }
     78     
     79     Q->Capacity = MaxElements;
     80     MakeEmpty( Q );
     81     return Q;
     82 }
     83 
     84 /*使队列为空*/
     85 void MakeEmpty( Queue Q )
     86 {
     87     Q->Size = 0;
     88     Q->Front = 1;        //注意,首次插入元素插入Q->Array[ 1 ] 
     89     Q->Rear = 0;
     90 }
     91 
     92 bool IsEmpty( Queue Q )
     93 {
     94     return Q->Size == 0;
     95 }
     96 
     97 bool IsFull( Queue Q )
     98 {
     99     return Q->Size == Q->Capacity;
    100 }
    101 
    102 /*入队操作*/
    103 void Enqueue( ElementType X, Queue Q )
    104 {
    105     if ( IsFull( Q ) )
    106     {
    107        printf( "Queue is full
    " );
    108        exit( 1 );
    109     }
    110     else
    111     {
    112         Q->Size++;
    113         Q->Rear = Succ( Q->Rear, Q );     //获取队尾
    114         Q->Array[ Q->Rear ] = X;
    115     }   
    116 }
    117 
    118 void Dequeue( Queue Q )
    119 {
    120     if ( IsEmpty( Q ) )
    121     {
    122        printf( "Queue is empty
    " );
    123        exit( 1 );
    124     }
    125     else
    126     {
    127         Q->Size--;
    128         Q->Front = Succ( Q->Front, Q );
    129     }
    130 }
    131 
    132 ElementType Front( Queue Q )
    133 {
    134     return Q->Array[ Q->Front ];
    135 }
    136 
    137 ElementType FrontAndDequeue( Queue Q )
    138 {
    139     ElementType n;
    140     
    141     if ( IsEmpty( Q ) )
    142     {
    143        printf( "Queue is empty
    " );
    144        exit( 1 );
    145     }
    146     else
    147     {
    148         n = Q->Array[ Q->Front ];
    149         Q->Size--;
    150         Q->Front = Succ( Q->Front, Q );
    151         return n;   
    152     }
    153 }
    154 
    155 void DisposeQueue( Queue Q )
    156 {
    157     free( Q->Array );
    158     free( Q );
    159 }
    160 
    161 void PrintfQueue( Queue Q )
    162 {
    163     while ( ! IsEmpty( Q ) )
    164         printf( "%3d", FrontAndDequeue( Q ) );
    165         
    166     printf( "
    " );
    167 }
    168 
    169 int Succ( int Value, Queue Q )
    170 {
    171     if ( ++Value == Q->Capacity )
    172        Value = 0;
    173        
    174     return Value;
    175 } 
  • 相关阅读:
    dB是乘以10还是乘以20
    FFT快速傅里叶变换的python实现
    f(t) = t的傅里叶系数
    如何从二进制文件中读取int型序列
    python中的bytes和str类型
    python文件读写
    matplotlib浅析
    什么是语法糖
    怎样查看一个可迭代对象的值
    十六进制颜色码及其表示-(6 digit color code)
  • 原文地址:https://www.cnblogs.com/weixia-blog/p/7307450.html
Copyright © 2011-2022 走看看