zoukankan      html  css  js  c++  java
  • 数据结构之队列

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

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(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
    ",*pVal);
            
        }else{
            printf("出队失败
    ");
        }
        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
  • 相关阅读:
    627. Swap Salary
    176. Second Highest Salary
    596. Classes More Than 5 Students
    183. Customers Who Never Order
    181. Employees Earning More Than Their Managers
    182. Duplicate Emails
    175. Combine Two Tables
    620. Not Boring Movies
    595. Big Countries
    HDU 6034 Balala Power! (贪心+坑题)
  • 原文地址:https://www.cnblogs.com/ljd4you/p/9584040.html
Copyright © 2011-2022 走看看