数据结构之队列

一、队列定义(实现“先入先出”的存储结构)

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

二、队列分类

链式队列:类似栈中定义的pTop&pBottom,在链式队列中定义pFront(队列头)&pRear(队列尾)

静态队列:用数组实现,通必须是循环队列

循环队列:
1.静态队列为什么必须是循环队列:必须循环才能利用好数组内存空间
2.循环队列需要几个参数来确定:front & rear
3.循环队列各个参数的含义
在不同场合有不同的含义;
  1)初始化:front & rear 都为零
  2)队列不空:front指向队列首个元素,rear指向队尾元素的下一个无效元素
  3)队列空:front & rear 相等,但是不一定为零
4.循环队列入队伪算法
  1)元素存入rear指向的位置;
  2)rear = (rear+1)% 数组长度
5.循环队列出对伪算法讲解
front = (front+1)% 数组长度
6.如何判断循环队列为空:front = rear
7.如何判断循环队列是否已满
两种方式:
1)多增加一个标志参数
2)少使用一个元素-->front和rear挨着
if( (rear+1)% 数组长度 == front )
     已满
else
    不满

三、代码实现

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

typedef struct Queue{
    int * pBase;
    int front;
    int rear;
}QUEUE;

void init(QUEUE *);
bool empty(QUEUE *);
bool full(QUEUE *);
bool in_queue(QUEUE *,int val);
bool out_queue(QUEUE *,int * pVal);
void traverse(QUEUE *);


int main(void)
{
    QUEUE Q;
    int val;
    int *pVal = &val;
    init(&Q);
    in_queue(&Q,1);
    in_queue(&Q,2);
    in_queue(&Q,3);
    in_queue(&Q,4);
    in_queue(&Q,5);
    in_queue(&Q,6);
    in_queue(&Q,7);
    traverse(&Q);
    if(out_queue(&Q,pVal))
    {
        printf("出队元素为:%d\n",*pVal);
        
    }else{
        printf("出队失败\n");
    }
    traverse(&Q);
    return 0;
}
//***********init()初始化******************* 
void init(QUEUE * pQ)
{
    pQ->pBase = (int *)malloc(sizeof(int)*6);
    pQ->front = 0;
    pQ->rear = 0;
}
//***********empty()判断是否为空******************* 
bool empty(QUEUE * pQ)
{
    if(pQ->front == pQ->rear)
    {
        return true;
    }else{
        return false;
    }
}
//***********full()判断是否满了******************* 
bool full(QUEUE * pQ)
{
    if((pQ->rear+1)%6 == pQ->front)
    {
        return true;
    }else{
        return false;
    }
}
//***********in_queue()入队******************* 
bool in_queue(QUEUE * pQ,int val)
{
    if(full(pQ))
    {
        return false;
    }else{
        pQ->pBase[pQ->rear] = val;
        pQ->rear = (pQ->rear+1)% 6;
        return true;
    }
}
//***********out_queue()出队******************* 
bool out_queue(QUEUE * pQ,int * pVal)
{
    if(empty(pQ))
    {
        return false;
    }else{
        * pVal = pQ->pBase[pQ->front];
        pQ->front = (pQ->front+1)% 6;
        return true;
    }
}
//***********traverse()遍历******************* 
void traverse(QUEUE * pQ)
{
    int i = pQ->front;
    while(i != pQ->rear)
    {
        printf("%d  ",pQ->pBase[i]);
        i = (i+1)% 6;
    }
}
View Code

 

posted @ 2018-09-04 14:07  刘建东  阅读(203)  评论(0编辑  收藏  举报