资讯专栏INFORMATION COLUMN

利用PHP实现常用的数据结构之队列(小白系列文章三)

Tony / 3041人阅读

摘要:队列算法名词解释在计算机编程语言中用来为复杂的声明定义简单的别名例如,你不用像下面这样重复定义有个字符元素的数组只需这样定义,类型即代表了具有个元素的字符数组,使用方法如下中译为结构,其实就是定义抽象数据类型例这个就是一个由班级姓名年龄

/**
*    PHP队列算法
*    Created on 2017-4-25
*    Author     entner
*    Email     1185087164@qq.com
*/
名词解释

1.typedef:在计算机编程语言中用来为复杂的声明定义简单的别名

例如,你不用像下面这样重复定义有 81 个字符元素的数组:

char line[81];
 
char text[81];

只需这样定义,Line类型即代表了具有81个元素的字符数组,使用方法如下

typedef char Line[81];

2.struct:中译为结构,其实就是定义抽象数据类型

例:

struct   Student   
    {   
        int  class;
        char name;
        int  age;
    }
   这个Student就是一个由班级、姓名、年龄等基本数据类型组成的抽象数据类型

3.typedef struct:就是定义一个抽象数据类型,并取一个别名

例:

typedef struct  Student   
    {   
        int  class;
        char name;
        int  age;
    }Stu;
    现在这个Stu就代表着Student即Student的别名
结构体类型,我也没学过,找资料看看,也能懂,没多难,不要怕.

请参看:struct和typedef struct彻底明白了

一、默写队列结构
   默写会让你记忆更深刻,同时也会锻炼抽象的逻辑思维,一边看不懂,就多看几遍,再查一查相关资料,应该问题不大,你甚至可以找张纸默写一下。
/**
*InitQueue 初始化队列
*
    Typedef int QueueElementType 
    Typedef Struct{
        QueueElementType  data[MaxSize]//指定数组长度
        Q->rear = 0            //指定队首队尾缺省值
        Q->front = 0
    }SQueue;
*/

/**
*EnQueue 入队
*    
    Status EnQueue(SQueue *Q,int e){
        //判断是否为满队
        if((Q->rear + 1) % MaxSize == Q->front){
        //如果队满则不能入队
            return error;
        }
        Q->data[Q->rear] = e;//入队
        Q->rear = (Q->rear + 1) % MaxSize;//队尾指针向后移动,在循环队列中,队尾有可能在队首前面,所以又一个取模运算
    }
*/

/**
*DeQueue 出队
*    
    Status Dequeue(SQueue *Q,int e){
        if(Q->front == Q->rear){
            return error;
        }
        e = Q->data[Q->front];    //将队首移出
        Q->front = (Q->front + 1) % MaxSize;    //将队首向后移动一位,若到数组最后一位且数组不为空,则移到数组头部
        return ok;
    }
*/
二、事先说明(细节问题)

针对队列这种数据结构,有两个指针,其中注意rear是指队尾元素的下一个元素而非队尾本元素 。在顺序队列中,front与rear相等时队列为空;但在循环队列中,当front与rear相等时,队列既可以为空也可以为满,所以判断循环队列满的问题是个常考点,在这里给一个公式:(rear+1)%QueueSize == front则队满

三、队列结构基本实现
/**
*TODO:队列元素输入输出
*    创建类,构造数组、数组长度、队尾指针、队首指针4个属性
*/
Class Queue{
    protected $front;
    protected $rear;
    protected $MaxSize;
    protected $queue = array(0=>"队列");
    protected $out;    //出队标识

    public function __construct(){
        $this->InitQueue();
    }
/**
*TODO:队列初始化
*@pagram int $maxsize 数组最大长度
*/
    public function InitQueue($maxsize){
        $this->front = 0;
        $this->rear  = 0;
        $this->MaxSize = $maxsize;
    }

/**
*TODO:入队操作
*@pagram int $e 入队元素
*/
    public function EnQueue($e){
        if(($this->rear + 1) % $this->MaxSize != $this->front){
            for($i=0;$iqueue[$this->rear] = $e[$i];
                $this->rear = ($this->rear + 1) % $this->MaxSize;
                echo $e[$i] . "入队成功" . "
"; } var_dump($this->queue); echo "
"; return $this->queue; }else{ return error; } } /** *TODO:出队操作 */ public function DeQueue(){ if($this->rear != $this->front){ $this->out = $this->queue[$this->front]; echo $this->out . "出队成功" . "
"; unset($this->out); //将队头部移出队列 $this->front = ($this->front + 1) % $this->MaxSize; } } /** *TODO:程序结束时执行 */ public function __destruct(){ echo "over"; } } $queue = new Queue(); $data = array( 0=>"entner", 1=>"momo", 2=>"binbo" ); $queue->EnQueue($data); $queue->DeQueue(); $queue->DeQueue(); $queue->DeQueue(); */
四、队列应用实现-PHPMailer发送邮件

PHPMailer扩展包

/**
*    队列邮件
*      查询数据库中status=0的邮箱账号,发送邮件
*/
    /*    引入PHPMailer类    */
    
      require_once("./PHPMailer-master/PHPMailerAutoload.php");

    /*    封装邮件函数    */
    function SendMail($Host,$From,$FromPass,$FormName,$To,$ToName){
        $mail = new PHPMailer;

        //$mail->SMTPDebug = 3;                               // Enable verbose debug output

        $mail->isSMTP();                                      // Set mailer to use SMTP
        $mail->Host = $Host;  // Specify main and backup SMTP servers
        $mail->SMTPAuth = true;                               // Enable SMTP authentication
        $mail->Username = $From;                 // SMTP username
        $mail->Password = $FromPass;   
        $mail->CharSet = "UTF-8";  
        $mail->setFrom($From, $FormName);                   
        $mail->addAddress($To,$ToName);
        $mail->isHTML(true);                                  // Set email format to HTML

        $mail->Subject = "PHPMailer";
        $mail->Body    = "利用PHPMailer,发送邮件";
        return $mail->send();
    }
    //你可以先测试一下邮件函数是否可行
    //SendMail("SMTP.126.com","roadcover@126.com","123qweasd","网易","entner@sina.com","sina")

    while(1){
        /*   连接数据库     */
        $conn = mysqli_connect("localhost","root","root","mail");
        if (mysqli_connect_errno())
            {
                echo "Failed to connect to MySQL: " . mysqli_connect_error();
                exit();
            }
        /*    查询数据库中status为0的记录加入队列    */    
        $res = mysqli_query($conn,"select * from mail where `status` = 0 order by `mail_id` ASC limit 5");
        $arr = array();

        //遍历结果集纳入数组     
        while($row = mysqli_fetch_array($res,MYSQLI_ASSOC)){
            $arr[] = $row;
        }
        
        /*    判断数组是否为空,即是否还有未发送的邮件    */
            if(empty($arr)){
                /*    跳出永真循环    */
                break;
            }else{
                /*    遍历数组,每30秒调用一次邮件函数,发送邮件,更新数据    */
                foreach($arr as $k=>$v){
                    if(SendMail("SMTP.126.com","roadcover@126.com","123qweasd","网易","{$v["address"]}","sina")){
                        mysqli_query($conn,"update mail set `status` = 1 ");
                        echo "邮件发送成功"."
"; }else{ echo "邮件发送失败"; } sleep(30); } } } //邮件发送完毕显示Done echo "done";
最后

如果您觉得这篇文章对您有所帮助,请为我点个赞吧:)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25967.html

相关文章

  • 利用PHP实现常用数据结构队列小白系列文章

    摘要:队列算法名词解释在计算机编程语言中用来为复杂的声明定义简单的别名例如,你不用像下面这样重复定义有个字符元素的数组只需这样定义,类型即代表了具有个元素的字符数组,使用方法如下中译为结构,其实就是定义抽象数据类型例这个就是一个由班级姓名年龄 /** * PHP队列算法 * Created on 2017-4-25 * Author entner * Emai...

    SimonMa 评论0 收藏0
  • 利用PHP实现常用数据结构写在前面(小白系列文章一)

    摘要:概述本系列文章主要运用以实现常用的数据结构,包括基本结构展现基本结构实现应用场景实现文章总体来说毕竟浅显,适合新手阅读和学习讨论,欢迎指教,其实每一个作者都是期待读者的反馈的。 之前都放在文章里,还是有点零散,刚好SF专栏门槛较低,便寻思着把文章重新整理一遍,这里也谢谢SF了。 概述 本系列文章主要运用PHP以实现常用的数据结构,包括: 1.基本结构展现 2.基本结构实现 3.应用场...

    guqiu 评论0 收藏0
  • 利用PHP实现常用数据结构写在前面(小白系列文章一)

    摘要:概述本系列文章主要运用以实现常用的数据结构,包括基本结构展现基本结构实现应用场景实现文章总体来说毕竟浅显,适合新手阅读和学习讨论,欢迎指教,但求勿喷。关于涉及到的知识点,我也尽可能写的详细一些,并向大家分享查阅的相关资料。 概述 本系列文章主要运用PHP以实现常用的数据结构,包括: 1.基本结构展现 2.基本结构实现 3.应用场景实现 文章总体来说毕竟浅显,适合新手阅读和学习讨论,...

    马龙驹 评论0 收藏0
  • 利用PHP实现常用数据结构排序(小白系列文章七)

    摘要:排序严格来说不算数据结构,更应该归于算法一类,因为数据结构指的是数据与数据之间的关系,排序参与其中,更多的是让数据状态发生了改变。 排序严格来说不算数据结构,更应该归于算法一类,因为数据结构指的是数据与数据之间的关系,排序参与其中,更多的是让数据状态发生了改变。于是,我们开始用PHP来聊聊算法。 引子 其实有一句话说的是不错的,不必重复造轮子,所以下面我将引用别人的文章作为本文的引文,...

    jayzou 评论0 收藏0
  • 利用PHP实现常用数据结构数据结构浅析(小白系列文章二)

    摘要:数据结构基本概念拆成数据和结构两个词来看,结构就是经过排列组合后映射到内存的一种关系,你想想化学中的分子结构就明白了,所以数据结构就是数据之间的一种关系,利用这些关系去处理强逻辑问题。该结构的数据元素之间存在着多对多的关系,也称网状结构。 数据结构起源与起因 起因:       因为现实世界问题大多数是复杂的而非简单的数值计算,将数据进行适当的排序、组合将有利于计算机对复杂性逻辑问题的...

    DesGemini 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<