/**
* PHP队列算法
* Created on 2017-4-25
* Author entner
* Email [email protected]
*/
名词解释
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","[email protected]","123qweasd","网易","[email protected]","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","[email protected]","123qweasd","网易","{$v['address']}","sina")){
mysqli_query($conn,"update mail set `status` = 1 ");
echo "邮件发送成功"."
";
}else{
echo "邮件发送失败";
}
sleep(30);
}
}
}
//邮件发送完毕显示Done
echo "done";
最后
如果您觉得这篇文章对您有所帮助,请为我点个赞吧:)