数据结构 静态队列笔记

/*
队列:一种先进先出的线性表,它只允许在表的一端插入元素,另一端
删除元素,其中插入元素的一端叫做队尾,删除元素的一端叫做对头。
 
静态队列——使用一维数组储存队列中的元素,一个指针(front)指向
队头,一个指针(rear)指向队尾。 
使用的数组必须是循环数组
*/

# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>

#define LEN 6  // 定义队列长度 

// 说明:此循环队列使用空出一个位置的方法解决队列空与满的问题 
typedef struct QUEUE
{
    int * pBase;       // 用于作为循环数组 
    int front;       // 用于标记队列头 
    int rare;        // 用于标记列尾 
}Queue, * pQ; 

// 创建一个静态队列 
void Create_Queue(pQ queue, int len); 
// 静态队列初始化
void Init_Queue(pQ queue);
// 遍历整个队列
void Travel_Queue(pQ queue); 
// 判断队列是否满 
bool Is_Full(pQ queue);
// 判断队列是否为空
bool Is_Empty(pQ queue); 
// 入队
void En_Queue(pQ queue, int val);
// 出队,并将出队的数据返还给主函数 
void Out_Queue(pQ queue, int * val); 
// 在队列中查找某元素,并返回该位置 
int Search_InQueue(pQ queue, int val);
// 计算此时队列长度 
int Length_Queue(pQ queue);
// 销毁整个队列
void Destory_Queue(pQ queue); 

int main(void)
{
    Queue queue;
    Create_Queue(&queue, LEN);
    Init_Queue(&queue);
    En_Queue(&queue, 1);
    En_Queue(&queue, 2);
    En_Queue(&queue, 3);
    En_Queue(&queue, 4);
    Travel_Queue(&queue);
    
    int len = Length_Queue(&queue);
    printf("队列长度为:%d\n", len);
    
    int val;
    Out_Queue(&queue, &val);
    printf("出队的元素是:%d\n", val);
    
    Search_InQueue(&queue, 5);
    
    Destory_Queue(&queue);
    
    return 0;
}

void Create_Queue(pQ queue, int len)
{ 
    queue->pBase = (int *)malloc(len * (sizeof(int)));
    if (NULL == queue->pBase)
    {
        printf("动态内存分配失败!\n");
        exit(-1);
    } 
    
    return;
} 

void Init_Queue(pQ queue)
{
    queue->front = 0;
    queue->rare = 0;
    
    return;
}

void Travel_Queue(pQ queue)
{
    int pos;
    for (pos = queue->front; pos != queue->rare; pos = (pos+1) % LEN)
    {
        printf("%-5d", queue->pBase[pos]);
    }
    printf("\n");
    
    return;
}

bool Is_Full(pQ queue)
{
    if ( (queue->rare + 1) % LEN == queue->front )
        return true;
    else
        return false;
}

bool Is_Empty(pQ queue)
{
    if (queue->front == queue->rare)
        return true;
    else
        return false;
}

void En_Queue(pQ queue, int val)
{
    if ( Is_Full(queue) )
    {
        printf("该队列已满!\n");
        exit(-1);
    }
    queue->pBase[queue->rare] = val;
    queue->rare = (queue->rare + 1) % LEN;
    
    return;
}

void Out_Queue(pQ queue, int * val)
{
    if ( Is_Empty(queue) )
    {
        printf("该队列为空!\n");
        exit(-1);
    }
    *val = queue->pBase[queue->front];
    queue->front = (queue->front + 1) % LEN;
    
    return;
}

int Search_InQueue(pQ queue, int val)
{
    int pos;
    for (pos = queue->front; pos != queue->rare; pos = (pos+1) % LEN)
    {
        if (queue->pBase[pos] == val)
        {
            return pos;
        }
    }
    printf("该元素不在此队列!\n");
    
    return -1;
}

int Length_Queue(pQ queue)
{
    int pos, cnt = 0;
    for (pos = queue->front; pos != queue->rare; pos = (pos+1) % LEN)
    {
        ++cnt;
    }
    
    return cnt;
}

void Destory_Queue(pQ queue)
{
    free(queue->pBase);
    queue->pBase = NULL;
    
    return;
}

 

posted @ 2017-04-18 22:30  荒唐了年少  阅读(701)  评论(0编辑  收藏  举报