zoukankan      html  css  js  c++  java
  • 算法学习记录队列

    队列

    与栈不同的是,队列是先进先出(First In First Out),这种结构在操作系统底层调用中广泛应用,

    比如:键盘输入abc,先输入的a最先显示出来,依次b、c。

    再比如:在操作系统中,将要处理的任务加入队列中,当cpu有空闲时,出队进行处理。

    队列和栈一样,也有顺序队列和队链(不知道这个称呼对不对)。

    这里我们讨论队链:

    栈中使用的栈顶做标记,因为它只需要一个口就可以进出。

    队列使用两个元素做标记,分别是队头和队尾(front and rear)。通过这两个指针的指向来指示队列的进出。

    front 负责出队列(EnQueue)。

    rear 负责进队列(DeQueue)。

    看一个队列示意图:

    这里需要两个结构:一个是队列的节点(Node)结构;另一个是指向队列的头尾的结构(该结构还可以包含队列大小等其他信息)。

    0.队列的结构

    typedef struct Node{ //队列的节点结构
        int data;
        struct Node* next;
    }qNode,*pqNode;
    
    typedef struct Que{  //队列的指示结构
        pqNode front,rear;
        int length;
    }linkQue;


    1.队列的初始化

    void init_queue(linkQue *que)
    {
        (*que).front = NULL;
        (*que).rear = NULL;
        (*que).length = 0;
    }


    2.队列的进队

    过程:

    a.开辟一个新节点;

    b.赋值,且新节点是最后一个元素,所以新节点的next指向NULL;

    c.队列的尾节点的next指向新节点;

    d.更新尾节点。

    void EnQueue(linkQue *que,int elem)
    {
        if ((*que).front == NULL)
        {
            pqNode n = (pqNode)malloc(sizeof(qNode));
            n->data = elem;
            n->next = NULL;
            (*que).front = n;
            (*que).rear = n;
        }
        else
        {
            pqNode n = (pqNode)malloc(sizeof(qNode));
            n->data = elem;
            n->next = NULL;
            (*que).rear->next = n;
            (*que).rear = n;
        }
        (*que).length++;
    }

    4.队列的出队

    过程:

    a.判断空;

    b.定位要出队的节点(front指向的节点)

    c.更新front指向节点(front的next节点)

    d.提取要出队的节点信息,作为返回值。

    e.free出队节点。

    int DeQueue(linkQue *que)
    {
        if ((*que).front == NULL)
        {
            printf("no element in queue!\n");
            return -1;
        }
        pqNode p = (*que).front;
        (*que).front=(*que).front->next;
        int re = p->data;
        free(p);
        (*que).length--;
        return re;
    }


    测试:

    void prt_que(linkQue que)
    {
        pqNode pos = que.front;
        while(que.rear->next != pos)
        {
            printf(" %d ",pos->data);
            pos = pos->next;
        }
        printf("\n");
    }


    主程序:

    int _tmain(int argc, _TCHAR* argv[])
    {
        int ary[10]= {2,65,4,34,35,86,68,35,1,54};
        linkQue queue;
        pqNode list = NULL;
        init_queue(&queue);
        
        printf("add elem in queue!\n");
        int i;
        for (i=0;i<10;i++)
        {
            EnQueue(&queue,ary[i]);
        }
        prt_que(queue);
        getchar();
    
        int t;
        for(i=0;i<5;i++)
        {
            t = DeQueue(&queue);
            printf("out:%d\n",t);
            printf("now queue:");
            prt_que(queue);
        }
        getchar();
    
        return 0;
    }

    结果:

  • 相关阅读:
    面向对象程序设计(三)
    面向对象程序设计(二)
    Class.forName()方法抛出异常
    Android Developer -- Bluetooth篇 开发实例之二 连接设备
    Android Developer -- Bluetooth篇 开发实例之一 扫描设备
    Android Developer -- Bluetooth篇 概述
    Android的数据存储方式概述
    Android 更新UI的两种方法——handler和runOnUiThread()
    Android UI 常用图标尺寸规范
    Android单个控件占父控件宽度一半且水平居中
  • 原文地址:https://www.cnblogs.com/jsgnadsj/p/3408556.html
Copyright © 2011-2022 走看看