数组函数与数据结构《实现堆栈,实现队列》

在强类型的变成语言中,有专用的数据结构解决方案。通常都是创建一个容器,在这个容器中可以存储任意类型的数据,并且可以根据容器中存储的数据决定容器的容量,达到可以变长的容器结构,比如链表、堆栈及队列等都是数据结构中常用的形式。在PHP中,通常都是使用数组来完成其他语言使用数据结构才能完成的工作。它是弱类型语言,在同一个数组中就可以存储多种类型的数据,而且PHP中的数组没有长度限制,数组存储数据的容量还可以根据里面元素个数的增减自动调整。

一、使用数组实现堆栈

堆栈是数据结构的一种实现形式,是一种使用非常广泛的存储数据的容器。在堆栈这种容器中,最后压入的数据(进桟),将会被最先弹出(出栈)。即在数据存储时采用“先进后出”的数据结构。在PHP中,将数组当做一个栈,使用array_push()和array_pop()两个系统函数即可完成数据的进桟和出栈操作。

①函数array_push()

array_push()函数向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度。该函数等于多次调用$array[]=$value。其函数的原型如下:

int array_push(array &array ,mixed var [,mixed...])

该函数的第一个参数是必选的,作为栈容器的一个数组。第二个参数也是必选的,在第一个参数中的数组尾部添加的一个数据。还可以有多个可选参数,都可以添加到第一个参数的数组中的尾部,即入栈。但需要注意即使数组中有字符串键名,添加的元素也始终是数字键。函数array_push()使用的代码如下所示:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

<?php

    $a=array("Dog","Cat");

    array_push($a,"Horse","Bird");

    print_r($a);          //输出Array ( [0] => Dog [1] => Cat [2] => Horse [3] => Bird )

    //带有字符串键的数组:

    $a=array("a"=>"Dog","b"=>"Cat");

    array_push($a,"Horse","Bird");

    print_r($a);              //输出Array ( [a] => Dog [b] => Cat [0] => Horse [1] => Bird )

    //使用array_push()函数和使用这种直接赋值初始化数组的方式是一样的

    $lamp["web"]= "www";

    print_r($a)          //输出Array ( [a] => Dog [b] => Cat [0] => Horse [1] => Bird [web]=> www)

?>

如果用array_push()来给数组添加一个单元,还不如用“$array[]=$value”形式,因为这样没有调用函数的额外负担,而且使用后者还可以添加键值是字符串的关联数组。如果第一个参数不是数组,array_push()将发出一条警告。这和“$array[]=$value”的行为不同,后者会新建一个数组。

②array_pop(array &array)

array_pop函数删除数组中的最后一个元素,即将数组最后一个单元弹出(出栈),并将数组的长度减1,如果数组为空(或者不是数组)将返回NULL。其函数的原型如下:

mixed array_pop(array &array)

该函数只有一个参数,即作为栈的数据。返回弹出的数组中最后一个元素的值。函数array_pop()使用的代码如下所示:


1

2

3

4

5

6

7

<?php

    //声明一个数组作为栈

    $lamp = array("Linux","Apache","MySQL","PHP");

    array_pop($lamp);

    print_r($lamp)          //输出 array([0]=>Linux [1]=>Apache [2]=>MySQL)

?>

二、使用数组实现队列

PHP中的数组处理函数还可以使用数组实现队列的操作。堆栈是“后进先出”原则,而一个队列则允许在一端插入数据,在另一端删除数据,也就是实现最先进入队列的数据最先退出队列,就像银行的排号机,最先排好的号最先办理业务。即队列是“先进先出”的原则。

使用array_push()和array_pop()函数都是从数组的最后添加数据和删除数据,如果使用array_push()函数在数组的最后添加数据,而将数组中第一个元素删除就可以实现一个队列。

③函数array_shift()

函数array_shift()可以实现删除数组中的第一个元素,并返回被删除元素的值。其函数的原型如下:

mixed array_shift(array &array)

该函数和array_pop()函数一样,都是只有一个必选参数,其参数为实现队列的数组。将数组中第一个单元移出并作为结果返回,将数组的长度减1,还将所有其他元素向前移动一位。所有的数字键名将改为从0开始计数,字符串键名将保持不变。如果数组为空(或者不是数组),则返回NULL。函数array_shift()使用的代码如下所示:


1

2

3

4

5

6

7

8

9

10

<?php

    //带有字符串键值的关联数组

    $lamp = array("a"=>"Linux","b"=>"Apache","c"=>"MySQL","d"=>"PHP");

    array_shift($lamp);       

    print_r($lamp);            //输出:Array([b]=>Apache [c]=>MySQL [d]=>PHP)

    $lamp = array("Linux","Apache","MySQL","PHP");

    array_shift($lamp);

    print_r($lamp);            //数字下标重新索引Array([0]=>Apache [1]=>MySQL [2]=>PHP)

?>

④函数array_unshift()

在PHP中海可以使用array_unshift()函数在队列数组的开头插入一个或多个元素,该函数执行成功将返回插入元素个数,使用格式和函数array_push()是一样的。通过前面介绍的这4个函数从而实现了从数组的任意一端添加和删除数据。

>> 本文固定链接: http://php.ncong.com/php_course/arry_function/shujujiegou.html

>> 转载请注明: 恩聪php 2014年04月14日 于 恩聪PHP学习教程 发表

数组函数与数据结构《实现堆栈,实现队列》

时间: 2024-08-26 20:50:56

数组函数与数据结构《实现堆栈,实现队列》的相关文章

数据结构--------(堆栈 和 队列)

1.栈 1.定义:只允许从一端插入或删除的线性表.逻辑结构:元素相邻:物理存储结构:顺序栈 和 链式栈:运算:只能从一端操作,受限的线性表 2.栈的基本操作: InintStack.StackEmpty.pop .push .peek(GetTop).ClearStack(6个) 3.顺序栈:利用一组连续地址存储单元存储自栈底到栈顶的元素,同时附有一个指针指向当前栈顶的位置 3.1  顺序栈操作: 初始时 S.top = -1;栈顶元素值:S.data[S.top] 进栈操作:首先判断是否栈满,

Mooc数据结构-02堆栈和队列

1 堆栈 1.1 堆栈的概念 表达式求值问题 表达式 = 运算数 + 运算符号 不同的运算符号优先级不一样 一般地, 运算是见到运算符号进行运算, 但是在一般的表达式中, 运算符号前面的值我们能够知道, 但是后面的值不一定是当前运算符运算的值, 因此这个运算增加了很大的困难 中缀表达式: 运算符位于两个运算数之间 后缀表达式: 运算符位于两个运算数之后 前缀表达式, 前中后缀表达式的转换 后缀表达式的求值顺序: 从左往右依次扫描, 遇到运算符就运算, 运算的运算数是就近就近就近的两个运算数 62

巧用javascript数组实现数据结构-堆栈与队列

简单的利用javascript的数组实现数据结构中的堆栈和队列.Stack.js源码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

数组拷贝、数组函数、通过数组函数来模拟数据结构的栈和队列、回调的意义、数组函数的排序问题、算法以及寻找素数的筛选法

1.数组的拷贝数组拷贝时指针的指向问题. 数组在拷贝时,指针的位置随之复制[这一点拷贝是完全一样]但是如果拷贝的数组的指针是非法的,那么拷贝出新指针的位置进行初始化<?php$arr1=array('123');end($arr1);next($arr1);//这个指针非法$arr2 = $arr1;//这里进行数组的拷贝var_dump(current($arr2));//得到指向‘123’元素的指针var_dump(current($arr1));//此时这个数组的指针有问题?> 但是拷贝

数据结构-堆栈和队列最简单的实现(Python实现)

OK,上篇博客我们介绍了双向链表以及代码实现,这篇文章我们来学习堆栈和队列. 队.栈和链表一样,在数据结构中非常基础一种数据结构,同样他们也有各种各样.五花八门的变形和实现方式.但不管他们形式上怎么变,队和栈都有其不变的最基本的特征,我们今天就从最基本,最简单的实现来看看队列和堆栈. 不管什么形式的队列,它总有的一个共同的特点就是"先进先出".怎么理解呢?就像是超市排队结账,先排队的人排在队的前面,先结账出队.这是队列的特征. 而堆栈则和队列相反,它是"先进后出",

数据存储的常用结构 堆栈、队列、数组、链表

数据存储的常用结构有:堆栈.队列.数组.链表.我们分别来了解一下: 堆栈,采用该结构的集合,对元素的存取有如下的特点: 先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素).例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹. 栈的入口.出口的都是栈的顶端位置 压栈:就是存元素.即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置. 弹栈:就是取元素.即,把栈的顶端位置元素取出,栈中已有元素依次

用LinkedList模拟一个堆栈或者队列数据结构 总结: LinkedList知识点

/** 用LinkedList模拟一个堆栈或者队列数据结构. 创建一个堆栈和队列数据结构对象,该对象中使用LinkedList来完成的. 知识点总结: 1.LinkedList特点:链表式数据结构. 重复有序,查询速度慢,增删速度快.不同步的. 2.LinkedList除了实现List接口增删改查的功能外,有一些特有的方法,能够实现在List(列表)的开头和结尾 插入,删除,获取等特有功能.这就是为什么LinkedList能够模拟一个堆栈,或者队列,双端队列的数据结构了. 涉及知识点: 1.什么

使用LinkedList模拟一个堆栈或者队列数据结构

使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出  如同一个杯子. 队列:先进先出  如同一个水管. import java.util.LinkedList; public class DuiLie { private LinkedList link; public DuiLie() { link = new LinkedList(); } public void myAdd(Object obj) { link.addFirst(obj); } public Object

java集合 collection-list-LinkedList 模拟一个堆栈或者队列数据结构。

/* 使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出 如同一个杯子. 队列:先进先出 First in First out FIFO 如同一个水管. */ import java.util.*; class DuiLie { private LinkedList link; DuiLie() { link = new LinkedList(); } public void myAdd(Object obj) { link.addFirst(obj); } public O