当前位置: 首页 > 后端技术 > PHP

使用PHP实现队列常用数据结构(小白系列文章3)

时间:2023-03-30 02:24:38 PHP

/***PHP队列算法*创建于2017-4-25*作者entner*Email1185087164@qq.com*/说明1.typedef:在计算机编程语言中用于为复杂的声明定义简单的别名。例如,您不必像这样重复定义具有81个字符元素的数组:char line[81];char text[81];就这样定义,Line类型表示一个有81个元素的字符数组,使用方法如下:typedefcharLine[81];{    intclass;    charname;    intage;    }   这个Student是由class,name,age等基本数据类型组成的抽象数据类型。3.typedefstruct:定义一个抽象数据类型,并取一个别名例子:typedefstructStudent    {    intclass;    字符名称;    年龄;    }斯图;    现在这个Stu代表的是Student,也就是Student的别名结构类型。我以前没学??过。找资料就明白了。这并不难。不要害怕。请参考:struct和typedefstruct全面理解1.默写队列结构的默写会让你的记忆更加深刻,同时也会锻炼你的抽象逻辑思维。不懂就多看几遍,查查相关资料。应该问题不大。你甚至可以找一张纸,听写下来。/***InitQueue初始化队列*typedefintQueueElementTypeTypedefStruct{QueueElementTypedata[MaxSize]//指定数组长度Q->rear=0//指定队列头尾的默认值Q->front=0}SQueue;*//***EnQueue加入队列*StatusEnQueue(SQueue*Q,inte){//判断队列是否满if((Q->rear+1)%MaxSize==Q->front){//如果队列已满则返回错误;}Q->data[Q->rear]=e;//入口Q->rear=(Q->rear+1)%MaxSize;//队列的尾指针向后移动,在循环队列中,队列的尾部可能在队列的头部之前,所以另一个模操作}*//***DeQueuedequeue*StatusDequeue(SQueue*Q,inte){if(Q->front==Q->rear){返回错误;}e=Q->data[Q->front];//将队头移出Q->front=(Q->front+1)%MaxSize;//设置队头向后移动一位,如果到达数组的最后一位且数组不为空,则移动到数组的头部返回ok;}*/2。队列结构基本实现/***TODO:队列元素输入输出*创建类,构造数组,数组长度,队列尾指针,队列头指针4个属性*/ClassQueue{protected$front;保护$后方;受保护的$MaxSize;受保护的$queue=array(0=>"queue");保护$out;//退出标志publicfunction__construct(){$this->InitQueue();}/***TODO:队列初始化*@pagramint$maxsize数组最大长度*/publicfunctionInitQueue($maxsize){$this->front=0;$this->rear=0;$this->MaxSize=$maxsize;}/***TODO:入队操作*@pagramint$e入队元素*/publicfunctionEnQueue($e){if(($this->rear+1)%$this->MaxSize!=$this->front){for($i=0;$iqueue[$this->rear]=$e[$i];$this->rear=($this->rear+1)%$this->MaxSize;回声$e[$i]。“成功加入队列”。“
”;}var_dump($this->queue);回声“
”;返回$this->队列;}else{返回错误;}}/***TODO:出队操作*/publicfunctionDeQueue(){if($this->rear!=$this->front){$this->out=$this->queue[$this->正面];回声$this->out。“成功脱队”。“
”;取消设置($this->out);//将队头移出队列$this->front=($this->front+1)%$this->MaxSize;}}/***TODO:在程序结束时执行*/publicfunction__destruct(){echo"over";}}$队列=新队列();$data=array(0=>"entner",1=>"momo",2=>"binbo");$queue->EnQueue($data);$queue->DeQueue();$队列->出队列();$queue->DeQueue();*/3.队列应用实现-PHPMailer发送邮件PHPMailer扩展包/***队列邮件*查询数据库中status=0的邮箱帐号并发送邮件*//*引入PHPMailer类*/require_once("./PHPMailer-master/PHPMailerAutoload.php");/*封装邮件函数*/functionSendMail($Host,$From,$FromPass,$FormName,$To,$ToName){$mail=newPHPMailer;//$邮件->SMTPDebug=3;//启用详细调试输出$mail->isSMTP();//设置邮件程序使用SMTP$mail->Host=$Host;//指定主备SMTP服务器$mail->SMTPAuth=true;//启用SMTP身份验证$mail->Username=$From;//SMTP用户名$mail->Password=$FromPass;$mail->CharSet='UTF-8';$mail->setFrom($From,$FormName);$mail->addAddress($To,$ToName);$邮件->isHTML(true);//将电子邮件格式设置为HTML$mail->Subject='PHPMailer';$mail->Body='使用PHPMailer,发送邮件';返回$mail->send();}//可以先测试邮件功能是否可以//SendMail("SMTP.126.com","roadcover@126.com","123qweasd","Netease","entner@sina.com","sina")while(1){/*连接数据库*/$conn=mysqli_connect('localhost','root','root','mail');if(mysqli_connect_errno()){echo"FailedtoconnecttoMySQL:".mysqli_connect_error();exit();}/*查询数据库中状态为0的记录并加入队列*/$res=mysqli_query($conn,"select*frommailwhere`status`=0orderby`mail_id`ASClimit5");$arr=array();//将结果集遍历到数组中while($row=mysqli_fetch_array($res,MYSQLI_ASSOC)){$arr[]=$row;}/*判断数组是否为空,即是否有未发送的邮件*/if(empty($arr)){/*breakoutof永恒循环*/break;}else{/*遍历数组,每隔30秒调用mail函数,发送邮件,更新数据*/foreach($arras$k=>$v){if(SendMail("SMTP.126.com","roadcover@126.com","123qweasd","网易","{$v['地址']}","新浪")){mysqli_query($conn,"更新邮件设置`status`=1");echo"Mailsentsuccessful."
";}else{echo"Mailfailedtosend";}sleep(30);}}}//doneecho"done"邮件发送完毕;最后,如果您觉得本文对您有帮助,请点个赞:)