某知名互联网金融企业PHP工程师面试笔试真题10_第1页
某知名互联网金融企业PHP工程师面试笔试真题10_第2页
某知名互联网金融企业PHP工程师面试笔试真题10_第3页
某知名互联网金融企业PHP工程师面试笔试真题10_第4页
某知名互联网金融企业PHP工程师面试笔试真题10_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

某知名互联网金融企业PHP工程师面试笔试真题10一、选择题1.

S市共有AB两个区,人口比例为3:5,据历史统计,A区的犯罪率为0.01%,B区的犯罪率为0.015%,现有一起新案件发生在S市,那么案件发(江南博哥)生在A区的可能性是______A.37.5%B.32.5%C.28.6%D.26.1%正确答案:C[解析]根据题目意思可知,假设A区的人数为3X,那么,B区人口数为5X,A区犯罪的人数为3X*0.01%,B区犯罪的人数为5X*0.015%。A区犯罪的可能性=(A区犯罪人数)/(A区犯罪人数+B区犯罪人数)=(3X*0.01%)/(3X*0.01%+5X*0.015%)=28.6%。

所以,本题的答案为C。

2.

有如下代码:

functiondouble($a){

return$a*$a;

}

$c=double(5);

则变量c的数据类型为______A.IntB.FloatC.DoubleD.String正确答案:A[解析]向double()函数内传入数字5,它的类型为Int,函数内5*5得到25返回给$c,两个Int类型的数相乘结果还是Int类型,因此$c的类型为Int。

所以,本题的答案为A。

3.

GMT时区下的时间戳与你所在时区下的时间戳的秒数差距是______A.取决于你所在时区与GMT时区的时间差B.没有差别C.只当你也在GMT时区时才会相同D.永远不会相同正确答案:B[解析]GMT叫格林尼治时间,其本身就是时间戳,任何时区下的当前时间都是相同的,当前时间是一个绝对的时间点,不存在秒数的差距。选项B正确。

所以,本题的答案为B。

4.

下面程序的运行结果是______

<?php

$nextWeek=time()+(7*24*60*60);

echo'Now:'.date('Y-m-d')."\\n";

echo'NextWeek:'.date('Y-m-d',$nextWeek)."\\n";

?>A.得到今天的日期(月-日)B.得到今天的日期(年-月-日)与下周的日期(年-月-日)C.得到现在的时间(小时-分-秒)D.得到现在到下周的时间间隔正确答案:B[解析]time()函数可以获取当前的时间戳,而时问戳是以秒为计算的。所以$nextWeek获取的是从当前时间开始7天的时间秒数,即下一周时间。可以通过date()函数输出当前时间格式或指定时间戳的时间格式。所以now对应的是今天的日期,而nextweek对应的是下周的时间。且格式为Y对应年,m对应月,d对应日。选项B正确。

所以,本题的答案为B。

5.

以下能匹配字符串PHP|architect的正则表达式是______A..*B....|.........C.\d{3}\|\d{8}D.[az]{3}\|[az]{9}E.[a-z][a-z][a-z]\|\w{9}正确答案:E[解析]对于选项A,“.*”可以表示匹配任意字符,虽然能够匹配题目中的条件字符串,但是相对于E的正则表达式来说并不规范,选项A错误。

对于选项B,并不存在这一正则表达式,选项B错误。

对于选项C,“\d”表示的是匹配数字,选项C错误。

对于选项D,该表达式的“[aZ]”格式不对,选项D错误。

对于选项E,“[a-z]”表示匹配a-z中的任意一个字母,“\|”表示转义“|”符,“\w”表示匹配字母或数字或下划线或汉字,“{9}”表示只能是9位。对于题目中的匹配字符串,该正则可以匹配,选项E正确。

所以,本题的答案为E。

6.

以下无法在PHP4中实现的面向对象的概念是______

①抽象类

②Final类

③public、private、protected(PPP)方法

④接口A.抽象类B.PPP方法C.PPP方法和接口D.以上所有都不可用E.以上所有都可用正确答案:D[解析]在PHP4.0的概念中,抽象类、final类、public、private、protected(PPP)方法都没有实现。选项D正确。

所以,本题的答案为D。

7.

以下有关PHP高级特性的说法中,正确的是______A.可以定义一个类去实现预定义接口Iterator,然后就能像访问数组一样访问这个类创建的对象B.spla_utoload_register()提供了一种更加灵活的方式来实现类的自动加载,不再建议使用autoload()函数C.PHP在对象中调用一个不可访问方法时,invoke()方法会被自动调用D.匿名函数也叫闭包函数,常用作回调函数参数的值,但是不能作为变量的值来使用正确答案:B[解析]对于选项A,只有ArrayAccess能够提供像访问数组一样访问这个对象的接口,不能定义一个类或预定义接口Iterator去实现这个功能。选项A错误。

对于选项B,因为可以通过spla_utoload_register()函数创建autoload函数的队列,按定义顺序逐个执行,比__autoload()只可以定义一次使用更方便,所以不建议使用autoload()函数。选项B正确。

对于选项C,__call方法是在创建一个类实例化后就可以直接调用对象使用,当调用的方法不可访问或没有权限访问时,会自动调用__call方法。选项C错误。

对于选项D,匿名函数是可以赋值给变量的。选项D错误。

所以,本题的答案为B。

8.

以下没有PHP扩展库的DBMS是______A.MySQLB.IBMDB/2C.PostgreSQLD.MicrosoftSQLServerE.以上都不对正确答案:E[解析]PHP支持大部分的数据库连接使用。对于PostgreSQL和MySQL数据库,PHP都拥有对应的扩展库。访问IBMDB/2可以用ODBC扩展,访问MicrosoftSQLServer可以用TDS和mssql扩展。选项E正确。

所以,本题的答案为E。

9.

以下代码能正确在浏览器中显示图片的是______A.<?php

$img=imagecreatefromjpeg("images/scce.jpg");

imagejpeg($img);

imagedestroy($img);

?>B.<?php

header("content-type:image/jpeg");

$img=imagecreatefromjpeg("images/scce.jpg");

imagejpeg($img);

imagedestroy($img);

?>C.<?php

header("content-type:image/jpeg");

$img=imagecreatefromfile("images/scce.jpg");

imageout($img);

imagedestroy($img);

?>D.<?php

header("content-type:image/jpeg");

$img=imageopen("images/scce.jpg");

imagejpeg($img);

imagedestroy($img);

?>正确答案:B[解析]当浏览器中显示图片时,首先需要使用Header函数来发送头信息,设置文件的内容,这里可以通过Header("content-type:image/jpeg")设定内容为一张jpeg的图片,然后使用imagecreatefromjpeg()函数来显示jpeg图片或者创建一个新图像,再通过imagejpeg()函数生成对应的jpeg格式图片,最后用imagedestroy($img)清除图片资源。选项B正确。

对于选项A,没有通过Header函数声明是图片,选项A错误。

对于选项C,不存在imageout()函数生成图片,选项C错误。

对于选项D,不存在imageopen()函数打开图片,选项D错误。

所以,本题的答案为B。

10.

如果php.ini配置允许,那么下面选项中,fopen()函数不支持的网络协议是______A.HTTPB.ftpC.mailD.zlib正确答案:C[解析]因为fopen()函数可以打开文件或者URL,所以格式为HTTP,ftp的网页路径可以打开,zlib的文件格式也是可以打开的。但是不支持打开mail函数查看邮件。选项C正确。

所以,本题的答案为C。

二、填空题1.

array_push()函数的作用是______。正确答案:将一个或多个元素压入数组的末尾。

2.

更改mysq1的表字段名的标准语法为______。正确答案:altertable表名change原名新名新类型[first|after]。[解析]修改表字段名:altertable表名CHANGE原字段名新字段名类型:

修改字段类型:altertable表名MODIFY字段名类型:

增加一个字段:altertable表名addCOLUMN字段名类型NOTNULL(或DEFAULTNULL);新增一个字段默认不为空(或默认为空);

删除一个字段:altertable表名DROPCOLUMN字段名;

3.

JS表单弹出对话框函数是______,获得输入焦点函数是______。正确答案:alert()、prompt()、confirm();focus()。

4.

在PHP中,“+”操作符的功能包括______、______。正确答案:数组数据合并、变量数据相加。[解析]“+”操作符可以实现数组的合并,但是合并遵循如下的规则:如果两个数组存在相同的key,那么结果保留前面数组中的值,而丢弃掉后面数组中的值,如下例所示:

$a=array(

1=>'a',

);

$b=array(

2=>'b',

1=>'c'

);

$c=$a+$b;

vat_dump($c);

程序的运行结果为

array(2){

[1]=>

string(1)"a"

[2]=>

string(1)"b"

}

“+”最常使用的功能就是实现变量数据的相加。

5.

<?phpecho1+2+"3+4+5";?>程序的运行结果为______。正确答案:6。[解析]首先运行1+2结果为3,在执行+"3+4+5";的时候会强制把这个字符串转换为整数,这个字符串转换后的整数为3,因此最终运行结果为3+3=6。

三、简答题1.

请说明在php.ini中safe_mode开启之后对于PHP系统函数的影响。正确答案:PHP中的save_mode开启后,可以提供一个安全的共享环境,它主要对系统的操作、文件、权限设置等产生影响。但该模式在PHP5.4.0以后已经被废除。该模式会对以下的函数产生影响:

1)首先是与操作文件系统有关的函数,这些函数访问文件时会被限制,例如,ckdir()、move_uploaded_file()、chgrp()、parse_ini_file()、chown()、rmdir()、copy()、rename()、fopen()、require()、highlight_file()、show_source()、include()、symlink()、link()、touch()、mkdir()、unlink()等函数。

2)其次还有一些其他的函数也会有影响,例如,exec()、shell_exec()、pasathru()、system()、popen()等。

2.

什么是数据库三级封锁协议?正确答案:众所周知,基本的封锁类型有两种:排它锁(X锁)和共享锁(S锁)。所谓X锁是事务T对数据A加上X锁时,只允许事务T读取和修改数据A。所谓S锁是事务T对数据A加上S锁时,其他事务只能再对数据A加S锁,而不能加X锁,直到T释放A上的S锁。若事务T对数据对象A加了S锁,则T就可以对A进行读取,但不能进行更新(S锁因此又称为读锁),在T释放A上的S锁以前,其他事务可以再对A加S锁,但不能加X锁,从而可以读取A,但不能更新A。

在运用X锁和S锁对数据对象加锁时,还需要约定一些规则,例如,何时申请X锁或S锁、持锁时间、何时释放等,称这些规则为封锁协议(LockingProtocol)。对封锁方式规定不同的规则,就形成了各种不同的封锁协议。一般使用三级封锁协议,也称为三级加锁协议。该协议是为了保证正确地调度事务的并发操作。三级加锁协议是事务在对数据库对象加锁、解锁时必须遵守的一种规则。下面分别介绍这三级封锁协议。

一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。使用一级封锁协议可以解决丢失修改问题。在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,它不能保证可重复读和不读“脏”数据。

二级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后方可释放S锁。二级封锁协议除防止了丢失修改,还可以进一步防止读“脏”数据。但在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。

三级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。三级封锁协议除防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读。

3.

什么是观察者模式?正确答案:观察者模式(也被称为发布/订阅模式)提供了避免组件之间紧密耦合的另一种方法,它将观察者和被观察的对象分离开。在该模式中,一个对象通过添加一个方法(该方法允许另一个对象,即观察者注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关,结果是对象可以相互对话,而不必了解原因。

例如,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界而上。而向对象设计的一个原则是,系统中的每个类将重点放在某一个功能上,而不是其他方而。一个对象只做一件事情,并且将它做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。

示例代码如下:

<?php

//观察者接口

interfaceInterfaceObserver

{

functiononListen($sender,$args);

functiongetObserverName();

}

//可被观察者接口

interfaceInterfaceObservable

{

functionaddObserver($observer);

functionremoveObserver($observer_name);

}

//观察者抽象类

abstractclassObserverimplementsInterfaceObserver

{

protected$observer_name;

functiongetObserverName()

{

return$this->observer_name;

}

functiononListen($sender,$args)

{}

}

//可被观察类

abstractclassObservableimplementsInterfaceObservable

{

protected$observers=array();

publicfunctionaddObserver($observer)

{

if($observerinstanceofInterfaceObserver)

{

$this->observers[]=$observer;

}

}

publicfunctionremoveObserver($observer_name)

{

foreach($this->observersas$index=>$observer)

{

if($observer->getObserverName()===$observer_name)

{

array_splice($this->observers,$index,1);

return;

}

}

}

}

//模拟一个可以被观察的类

classAextendsObservable

{

publicfunctionaddListener($listener)

{

foreach($this->observersas$observer)

{

$observer->onListen($this,$listener);

}

}

}

//模拟一个观察者类

classBextendsObserver

{

protected$observer_name='B';

publicfunctiononListen($sender,$args)

{

var_dump($sender);

echo"<br>";

var_dump($args);

echo"<br>";

}

}

//模拟另外一个观察者类

classCextendsObserver

{

protected$observer_name='C';

publicfunctiononListen($sender,

$args)

{

var_dmnp($sender);

echo"<br>";

var_dump($args);

echo"<br>";

}

}

$a=newA();

//注入观察者

$a->addObserver(newB());

$a->addObserver(newC());

//可以看到观察到的信息

$a->addListener('D');

//移除观察者

$a->removeObserver('B');

?>

4.

面向对象几大原则是什么?正确答案:面向对象存在五大基本原则,分别是单一职责原则、开放封闭原则、替换原则、依赖倒置原则和接口隔离原则。

(1)单一职责原则

所谓单一职责原则,即一个类最好只做一件事,以提高内聚性来减少引起变化的原因,单一原则是低耦合、高内聚在面向对象原则上的引申。

(2)开放封闭原则

软件的功能应该是可扩展的,尽可能减少修改,因为修改程序可能会对原来的程序造成影响。虽然建议尽可能不修改程序,但是允许通过添加功能来减少修改。

(3)替换原则

只有子类能够替换基类,在继承机制的约束规范中,子类替换基类时,可以保证运行期内识别子类,保证继承复用。

(4)依赖倒置原则

高层模块不依赖底层模块,二者都依赖于抽象,抽象不依赖于实体,而实体依赖于抽象。模块间的依赖是通过抽象方法发生的,实现类中不发生直接的依赖关系,而依赖关系是通过接口或抽象类产生的。即接口或抽象类不依赖于实现类,而实现类依赖于接口和抽象类。这种依赖倒置原则可以有效地减少类之间的耦合性,提高系统的稳定性,减少并发引起的风险,提高代码的可读性和可维护性。

(5)接口隔离原则

建议开发使用多个小的、专门的接口,避免使用一个大的总接口。即每一个功能有一个专门的功能接口,需要用到才调用,不需要全部功能汇总到一个接口,这样可以提高代码的灵活性,降低类之间的耦合性,提高稳定性。

5.

SVN与Git的区别是什么?它们的工作流程是什么?使用Git有什么好处?怎样处理冲突?Git中基本的命令有哪些?正确答案:SVN和Git的区别如下:

1)SVN属于集中化的版本控制系统,使用起来更像是档案仓库,支持并行读写,支持代码的版本化管理,可以对代码进行取出、导入、更新、分支、还原、改名和合并等。

而SVN和Git一样都有一个版本库或服务器,被使用时是分布式模式,每个开发人员从中心版本库或服务器上下载代码到自己的机器,然后自己有专属的版本库,可以对这个版本库进行开发管理。

2)SVN是按文件进行存储,而Git是把内容按元数据方式存储。

3)SVN有一个全局的版本号,而Git没有。

4)Git的内容完整性比SVN完整。Git对内容存储主要使用的是SHA-1哈希算法,确保了代码内容的完整性,即使遇到硬盘或网络故障对代码的损害都可以降低。

5)在Git上的分支可以很快速地在工作目录下和分支间进行切换,然后发现未合并的分支可以进行合并。而SVN的分支相当于版本库中的另一个目录,合并需要手动输入命令完成。

使用Git的好处有代码库占的空间小,对程序源代码进行差异化的版本管理,存在多个分支代码开发等。

在提交代码到Git中遇到冲突时,可以根据开发者的反馈进行判断,如果是主开发者发现两个开发者之间的冲突,那么可以让他们白行解决冲突,让其中一个人先提交代码。如果是主开发者可以自己解决的问题,那么就自己解决冲突再上传。

Git中主要使用的基本命令有:

1)通过Gitclone'版本库地址'把项目复制到本地。

2)通过Gitadd.可以将代码的修改全部修改提交到本地暂存区。

3)通过Gitcommit-m'注释'使用commit命令提交添加到缓存区的文件到本地仓库。

4)通过Gitpush将本地分支更新的部分推送到远程主机上。

四、编程题1.

给定一台有m个存储空间的机器,有n个请求需要在这台机器上运行,第i个请求计算时需要占R[i]空间,计算结果需要占O[i]个空间(O[i]<R[i])。请设计一个算法,判断这n个请求能否全部完成?若能,给出这n个请求的安排顺序。正确答案:这道题的主要思路为,首先对请求按照R[i]-O[i]由大到小进行排序,然后按照由大到小的顺序进行处理,如果按照这个顺序能处理完,则这n个请求能被处理完,否则处理不完。那么请求i能完成的条件是什么呢?在处理请求i的时候前面所有的请求都已经处理完成,那么它们所占的存储空间为O[0]+O[1]+…+O[i-1],剩余的存储空间left为left=m-(O[0]+O[1]+…+O[i-1]),要使请求i能被处理完,则必须满足left≥R[i],只要剩余的存储空间能存放R[i],那么在请求处理完成后就可以删除请求,从而把处理的结果放到存储空间中,由于O[i]<R[i],此时必定有空间存放O[i]。

至于为什么用R[i]-O[i]由大到小的顺序来处理,来看下面的分析:

假设第一步处理R[i]-O[i]最大的值。使用归纳法(假设每一步都取剩余请求中R[i]-O[i]最大的值进行处理),假设n=k时能处理完成,那么当n=k+1时,由于前k个请求是按照R[i]-O[i]从大到小排序的,在处理第k+1个请求时,此时需要的空间为A=O[1]+…+O[i]+…+O[k]+R[k+1],只有A≤m的时候才能处理第k+1个请求。假设把第k+1个请求和前面的某个请求i交换位置,即不按照R[i]-O[i]由大到小的顺序来处理,在这种情况下,第k+1个请求已经被处理完成,接着要处理第i的请求,此时需要的空间为B=O[1]+…+O[i-1]+O[k+1]+O[i+1]+…+R[i],如果B>A,则说明按顺序处理成功的可能性更大(越往后处理剩余的空间越小,请求需要的空间越小越好);如果B<A,则说明不按顺序更好。根据R[i]-O[i]有序的特点可知:R[i]-O[i]≥R[k+1]-O[k+1],即O[k+1]+R[i]≥O[i]+R[k+1],所以,B≥A,因此,可以得出结论:方案B不会比方案A更好。即方案A是最好的方案,也就是说,按照R[i]-O[i]从大到小排序处理请求,成功的可能性最大。如果按照这个序列都无法完成请求序列,那么任何顺序都无法实现全部完成,实现代码如下:

<?php

functionswap(&$a,&$b)

{

$temp=$a;

$a

=$b;

$b

=$temp;

}

/*按照R[i]-O[i]由大到小进行排序*/

functionbubbleSort(&$R,&$O,$len)

{

for($i=0;$i<$len-1;++$i)

{

for($j=$len-1;$j>$i;--$j)

{

if($R[$j]-$O[$j]>$R[$j-1]-$O[$j-1])

{

swap($R[$j],$R[$j-1]);

swap($O[$j],$O[$j-1]);

}

}

}

}

functionschedule(&$R,&$O,$len,$M)

{

bubbleSort($R,$O,$len);

$left=$M;//剩余可用的空间数

$i;

for($i=0;$i<$len;$i++)

{

if($left<$R[$i])

//剩余的空间无法继续处理第i个请求

{

returnfalse;

}

else

//剩余的空间能继续处理第i个请求,处理完成后将占用O[i]个空间

{

$left-=$O[$i];

}

}

returntrue;

}

$R=[10,15,23,20,6,9,7,16];

$O=[2,7,8,4,5,8,6,8];

$N=8;

$M=50;

$i;

$schedueResult=schedule($R,$O,$N,$M);

if($schedueResult)

{

printf("按照如下请求序列可以完成:\n");

for($i=0;$i<$N;$i++)

{

printf("{%d,%d}",$R[$i],$O[$i]);

}

}

else

{

printf("无法完成调度\n");

}

?>

程序的运行结果为

按照如下请求序列可以完成:{20,4}{23,8}{10,2}{15,7}{16,8}{6,5}{9,8}{7,6}

算法性能分析:这个算法的时间复杂度为O(N^2)。

2.

写一个函数,尽可能高效地从一个标准url里取出文件的扩展名。例如,/abc/de/fg.php?id=1需要取出php或.php。正确答案:方法1:

functiongetExt($url){

$arr=parse_url($url);

$file=basename($arr['path']);

$ext=explode(".",$file);

return$ext[1];

}

方法2:

functiongetExt($url){

$url=basename($url);

$pos1=strpos($url,".");

$pos2=strpos($url,"?");

if(strstr($url,"?”)){

returnsubstr($url,$pos1+1,$pos2-$pos1-1);

}else{

returnsubstr($url;$pos1);

}

}

3.

翻转(也叫颠倒)栈的所有元素,例如,输入栈(1,2,3,4,5),其中,1处在栈顶,翻转之后的栈为(5,4,3,2,1),其中,5处在栈顶。正确答案:最容易想到的办法是申请一个额外的队列,先把栈中的元素依次出栈放到队列里,然后把队列里的元素按照出队列顺序入栈,这样就可以实现栈的翻转,这种方法的缺点是需要申请额外的空间存储队列,因此,空间复杂度较高。下面介绍一种空间复杂度较低的递归的方法。

递归程序有两个关键因素需要注意:递归定义和递归终止条件。经过分析后,很容易得到该问题的递归定义和递归终止条件。递归定义:将当前栈的最底元素移到栈顶,其他元素顺次下移一位,然后对不包含栈顶元素的子栈进行同样的操作。终止条件:递归下去,直到栈为空。递归的调用过程如下图所示。

在上图中,对于栈(1,2,3,4,5)进行翻转的操作:首先把栈底元素移动到栈顶得到栈(5,1,2,3,4),然后对不包含栈顶元素的子栈进行递归调用(对子栈元素进行翻转),子栈(1,2,3,4)翻转的结果为(4,3,2,1),因此,最终得到翻转后的栈为(5,4,3,2,1)。

此外,由于栈的后进先出的特点,使得只能取栈顶的元素,因此,要把栈底的元素移动到栈顶也需要递归调用才能完成,主要思路:把不包含该栈顶元素的子栈栈底的元素移动到子栈的栈顶,然后把栈顶的元素与子栈栈顶的元素(其实就是与栈顶相邻的元素)进行交换,如下图所示。

为了容易理解递归调用,可以认为在进行递归调用的时候,子栈已经实现了把栈底元素移动到了栈项,在上图中为了把栈(1,2,3,4,5)的栈底元素5移动到栈顶,首先对子栈(2,3,4,5)进行递归调用,调用的结果为(5,2,3,4),然后对子栈顶元素5,与栈顶元素1进行交换,得到栈(5,1,2,3,4),实现了把栈底元素移动到了栈顶。

示例代码如下:

<?php

header("content-type:text/html;charset=utf-8");

classLNode{

public$mElem;

public$mNext;

publicfunction__construct(){

$this->mElem=NULL;

$this->mNext=NULL;

}

}

classStackLinked{

//头“指针”,指向栈顶元素

public$mNext;

publicstatic$mLength;

/**

*初始化栈

*

*@returnvoid

*/

publicfunction__construct(){

$this->mNext=NULL;

self::$mLength=0;

}

/**

*判断栈是否空栈

*

*@returnboolean如果为空栈返回true,否则返回false

*/

publicfunctiongetIsEmpty(){

if($this->mNext==NULL){

returntrue;

}else{

returnfalse;

}

}

/**

*将所有元素出栈

*

*@returnarray返回所有栈内元素

*/

publicfunctiongetAllPopStack(){

$e=array();

if(!$this->getIsEmpty()){

while($this->mNext!=NULL){

$e[]=$this->mNext->mElem;

$this->mNext=$this->mNext->mNext;

}

}

self::$mLength=0;

return$e;

}

/**

*返回栈内元素个数

*

*@returnint

*/

publicstaticfunctiongetLength(){

returnself::$mLength;

}

/**

*元素进栈

*

*@parammixed$e进栈元素值

*@returnboolean进栈成功返回true

**/

publicfunctionpush($e){

$newLn=newLNode();

$newLn->mElem=$e;

$newLn->mNext=$this->mNext;

$this->mNext=&$newLn;

self:;$mLength++;

returntrue;

}

/**

*元素出栈

*

*@returnboolean出栈成功返回true,否则返回false

**/

publicfunctionpop(){

if($this->getIsEmpty()){

returnfalse;

}

$p=$this->mNext;

$e=$p->mElem;

$this->mNext=$p->mNext;

self::$mLength--;

returntrue;

}

/**

*返回栈内所有元素

*

*@returnarray栈内所有元素组成的一个数组

*/

publicfunctiongetAllElem(){

$sldata=array();

if(!$this->getIsEmpty()){

$p=$this->mNext;

while($p!=NULL){

$sldata[]=$p->mElem;

$p=$p->mNext;

}

return$sldata;

}

}

/*

*返回栈顶元素

*@return$element返回栈顶元素

*/

publicfunctiontop()

{

if($this->getIsEmpty()){

returnfalse;

}

$list=$this->getAllElem();

$element=$list[0];

return$element;

}

/*

**函数功能:把栈底元素移动到栈顶

*/

publicfunctionmove_bottom_to_top()

{

if($this->getIsEmpty())

return;

$

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论