首页 > Web开发 > PHP教程 > 正文

php有没有链表类型?php没有链表类型么

互联网 2019-09-23 11:10:36 0

PHP SPL标准库里实现了几种简单的线性表和树型结构,其中包括了双链表和双链表实现的队列和栈、最大堆、最小堆和优先队列。双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储自己的信息,还要保存前驱和后继节点的地址。


php有没有链表类型?php没有链表类型么

双链表对php开发程序来讲是很重要的一种数据结构,可以把PHP数组中想想成一个双链表,而PHP内置的SplDoublyLinkedList类通过实现迭代器、数组访问和获取数量的接口使程序访问对象变得访问数组一样方便。

SplDoublyLinkedList类代码如下:

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

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

<?php 

/**

 * PS:预定义接口Iterator, ArrayAccess, Countable

 */ 

class SplDoublyLinkedList implements Iterator, ArrayAccess, Countable 

    /** 

     * @var _llist 定义一个数组用于存放数据

     */ 

    protected $_llist   = array(); 

   

    /** 

     * @var _it_mode 链表的迭代模式

     */ 

    protected $_it_mode = 0; 

   

    /** 

     * @var _it_pos 链表指针

     */ 

    protected $_it_pos  = 0; 

    /** 

     * 迭代模式

     * @see setIteratorMode

     */ 

    const IT_MODE_LIFO     = 0x00000002; 

    const IT_MODE_FIFO     = 0x00000000; 

    const IT_MODE_KEEP     = 0x00000000; 

    const IT_MODE_DELETE   = 0x00000001; 

   

    /** 

     * @return 返回被移出尾部节点元素

     * @throw RuntimeException 如果链表为空则抛出异常

     */ 

    public function pop() 

    

        if (count($this->_llist) == 0) { 

            throw new RuntimeException("Can't pop from an empty datastructure"); 

        

        return array_pop($this->_llist); 

    

   

    /** 

     * @return 返回被移出头部节点元素

     * @throw RuntimeException 如果链表为空则抛出异常

     */ 

    public function shift() 

    

        if (count($this->_llist) == 0) { 

            throw new RuntimeException("Can't shift from an empty datastructure"); 

        

        return array_shift($this->_llist); 

    

   

    /** 

     * 往链表尾部添加一个节点元素

     * @param $data 要添加的节点元素

     */ 

    public function push($data

    

        array_push($this->_llist, $data); 

        return true; 

    

   

    /** 

     * 往链表头部添加一个节点元素

     * @param $data 要添加的节点元素

     */ 

    public function unshift($data

    

        array_unshift($this->_llist, $data); 

        return true; 

    

   

    /** 

     * @return 返回尾部节点元素,并把指针指向尾部节点元素

     */ 

    public function top() 

    

        return end($this->_llist); 

    

   

    /** 

     * @return 返回头部节点元素,并把指针指向头部节点元素

     */ 

    public function bottom() 

    

        return reset($this->_llist); 

    

   

    /** 

     * @return 返回链表节点数

     */ 

    public function count() 

    

        return count($this->_llist); 

    

   

    /** 

     * @return 判断链表是否为空

     */ 

    public function isEmpty() 

    

        return ($this->count() == 0); 

    

    /** 

     * 设置迭代模式

     * - 迭代的顺序 (先进先出、后进先出)

     *  - SplDoublyLnkedList::IT_MODE_LIFO (堆栈)

     *  - SplDoublyLnkedList::IT_MODE_FIFO (队列)

     *

     * - 迭代过程中迭代器的行为

     *  - SplDoublyLnkedList::IT_MODE_DELETE (删除已迭代的节点元素)

     *  - SplDoublyLnkedList::IT_MODE_KEEP   (保留已迭代的节点元素)

     *

     * 默认的模式是 0 : SplDoublyLnkedList::IT_MODE_FIFO | SplDoublyLnkedList::IT_MODE_KEEP

     *

     * @param $mode 新的迭代模式

     */ 

    public function setIteratorMode($mode

    

        $this->_it_mode = $mode

    

   

    /** 

     * @return 返回当前的迭代模式

     * @see setIteratorMode

     */ 

    public function getIteratorMode() 

    

        return $this->_it_mode; 

    

   

    /** 

     * 重置节点指针

     */ 

    public function rewind() 

    

        if ($this->_it_mode & self::IT_MODE_LIFO) { 

            $this->_it_pos = count($this->_llist)-1; 

        } else

            $this->_it_pos = 0; 

        

    

   

    /** 

     * @return 判断指针对应的节点元素是否存在

     */ 

    public function valid() 

    

        return array_key_exists($this->_it_pos, $this->_llist); 

    

   

    /** 

     * @return 返回当前指针的偏移位置

     */ 

    public function key() 

    

        return $this->_it_pos; 

    

   

    /** 

     * @return 返回当前指针对应的节点元素

     */ 

    public function current() 

    

        return $this->_llist[$this->_it_pos]; 

    

   

    /** 

     * 将指针向前移动一个偏移位置

     */ 

    public function next() 

    

        if ($this->_it_mode & self::IT_MODE_LIFO) { 

            if ($this->_it_mode & self::IT_MODE_DELETE) { 

                $this->pop(); 

            

            $this->_it_pos--; 

        } else

            if ($this->_it_mode & self::IT_MODE_DELETE) { 

                $this->shift(); 

            } else

                $this->_it_pos++; 

            

        

    

    /** 

     * @return 偏移位置是否存在

     *

     * @param $offset             偏移位置

     * @throw OutOfRangeException 如果偏移位置超出范围或者无效则抛出异常

     */ 

    public function offsetExists($offset

    

        if (!is_numeric($offset)) { 

            throw new OutOfRangeException("Offset invalid or out of range"); 

        } else

            return array_key_exists($offset, $this->_llist); 

        

    

   

    /** 

     * @return 获取偏移位置对应的值

     *

     * @param $offset             偏移位置

     * @throw OutOfRangeException 如果偏移位置超出范围或者无效则抛出异常

     */ 

    public function offsetGet($offset

    

        if ($this->_it_mode & self::IT_MODE_LIFO) { 

            $realOffset = count($this->_llist)-$offset

        } else

            $realOffset = $offset

        

        if (!is_numeric($offset) || !array_key_exists($realOffset, $this->_llist)) { 

            throw new OutOfRangeException("Offset invalid or out of range"); 

        } else

            return $this->_llist[$realOffset]; 

        

    

   

    /** 

     * @return 设置偏移位置对应的值

     *

     * @param $offset             偏移位置

     * @throw OutOfRangeException 如果偏移位置超出范围或者无效则抛出异常

     */ 

    public function offsetSet($offset, $value

    

        if ($offset === null) { 

            return $this->push($value); 

        

        if ($this->_it_mode & self::IT_MODE_LIFO) { 

            $realOffset = count($this->_llist)-$offset

        } else

            $realOffset = $offset

        

        if (!is_numeric($offset) || !array_key_exists($realOffset, $this->_llist)) { 

            throw new OutOfRangeException("Offset invalid or out of range"); 

        } else

            $this->_llist[$realOffset] = $value

        

    

   

    /** 

     * @return 删除偏移位置对应的值

     *

     * @param $offset             偏移位置

     * @throw OutOfRangeException 如果偏移位置超出范围或者无效则抛出异常

     */ 

    public function offsetUnset($offset

    

        if ($this->_it_mode & self::IT_MODE_LIFO) { 

            $realOffset = count($this->_llist)-$offset

        } else

            $realOffset = $offset

        

        if (!is_numeric($offset) || !array_key_exists($realOffset, $this->_llist)) { 

            throw new OutOfRangeException("Offset invalid or out of range"); 

        } else

            array_splice($this->_llist, $realOffset, 1); 

        

    

?>

以上就是php没有链表类型么的详细内容,更多请关注web开发者其它相关文章!


  • 相关标签:php教程 PHP PHP学习
  • 版权归原作者所有,如果有侵犯到您的权益,请联系本站删除!
  • 相关文章


    专题推荐

    今日头条
  • 手机哪款好?8月值得买的手机就这四款 手机哪款好?8月值得买的手机就这四款
  • 七夕保命技能书送上 女朋友还有30秒到达战场 七夕保命技能书送上 女朋友还有30秒到达战场
  • 七夕保命技能书送上 女朋友还有30秒到达战场 七夕保命技能书送上 女朋友还有30秒到达战场
  • 七夕搞笑句子大全2019 七夕微信说说笑死人那种 七夕搞笑句子大全2019 七夕微信说说笑死人那种
  • 热门标签