php输出mysql的数据结构_利用PHP实现常用的数据结构之队列(小白系列文章三)...

/**

* 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的别名

结构体类型,我也没学过,找资料看看,也能懂,没多难,不要怕.

一、默写队列结构

默写会让你记忆更深刻,同时也会锻炼抽象的逻辑思维,一边看不懂,就多看几遍,再查一查相关资料,应该问题不大,你甚至可以找张纸默写一下。

/**

*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;$i

$this->queue[$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发送邮件

/**

* 队列邮件

* 查询数据库中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";

最后

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值