zoukankan      html  css  js  c++  java
  • php数据结构课程---4、栈(是什么)

    php数据结构课程---4、栈(是什么)

    一、总结

    一句话总结:

    栈(stack),它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。

    1、栈的链表实现?

    定义node,设置属性data,prev
    定义stack类,设置栈顶top,size
    编写出栈push(),pop()函数
    返回栈所有数据函数getAll()
    <?php 
    
    class Node{
        public $data = null;
        public $prev = null;
    
        public function __construct($data){
            $this->data = $data;
        }
    }
    
    class stack{
        private $top = null;
        public $size = 0;
    
        public function push($data)
        {
            if($this->top == null){
                $this->top = new Node($data);
            }else{
                $n = new Node($data);
                $n->prev = $this->top;
                $this->top = $n;
            }
            $this->size++;
        }
    
        public function pop()
        {
            $data = $this->top->data;
            $this->top = $this->top->prev;
            $this->size--;
            return $data;
        }
    
    
        public function getAll(){
            $result = [];
            while($this->top){
                $result[]=$this->top->data;
                $this->top = $this->top->prev;
            }
            return $result;
        }
    
    }
    
    // $s = new stack();
    // $s->push("aaaa");
    // $s->push("bbb");
    // $s->push("dddddd");
    // $s->push("cc");
    // $s->push("eeee");
    // echo '<pre>';
    // echo $s->pop();
    
    // var_dump($s->getAll());

    2、数组模拟栈?

    array_push() array_pop()
    //数组模拟栈
    
    $stack = [];
    array_push($stack,"aaa");
    array_push($stack,"bbb");
    array_push($stack,"ccc");
    array_push($stack,"ddd");
    array_push($stack,"eee");
    echo array_pop($stack);
    echo array_pop($stack);

    3、括号匹配应用(比如[[()]()])?

    算法思路:如果是左边的括号,就将对应的右括号押进栈,如果是右边的括号,判断栈里面是否有这个括号,没有说明不匹配
    <?php 
    
    $stack =  new SplStack();
    
    $str = "[[[]](){}]";
    echo $str."</br>";
    $symbols =["("=>")","["=>"]","{"=>"}"];
    // $keys =["(","[","{"];
    // $values = [")","]","}"];
    
    
    $result = "匹配";
    for ($i=0; $i < strlen($str) ; $i++) { 
        if(in_array($str[$i], array_keys($symbols))){
            $stack->push($symbols[$str[$i]]);
        }else if(in_array($str[$i], array_values(($symbols)))){
            if(!$stack->isEmpty()){
                if($str[$i] != $stack->pop()){
                    $result = "不匹配!";
                    break;
                }
            }else{
                $result = "不匹配!";
                break;
            }
        }
    }
    if($stack->isEmpty()){
        echo $result;
    }else{
        echo "不匹配!!";
    }
    
    
    // $stack = new SplStack();
    // $str = "[[()][]";
    // // $str = "[()][]]";
    // echo $str."</br>";
    
    // for ($i=0; $i < strlen($str); $i++) { 
    //     if ($str[$i] == "[") {
    //         $stack->push("]");
    //     }elseif ($str[$i] == "(") {
    //         $stack->push(")");
    //     }elseif ($str[$i] == ")") {
    //         if(!$stack->isEmpty()){
    //             $pop = $stack->pop();
    //             if($pop != ")"){
    //                 echo "not match!";exit;
    //             }
    //         }else{
    //             echo "not match!";exit;
    //         }
    //     }elseif ($str[$i] == "]") {
    //         if(!$stack->isEmpty()){
    //             $pop = $stack->pop();
    //             if($pop != "]"){
    //                 echo "not match!";exit;
    //             }
    //         }else{
    //             echo "not match!";exit;
    //         }
    //     }
    // }
    // if($stack->isEmpty()){
    //     echo "匹配!";
    // }else{
    //     echo "不匹配!!";
    // }

    4、八皇后的栈实现(不在同一条横线,竖线,左斜线,右斜线上)?

    已选取的元素存入栈
    判断左右斜线:$i和$j的差值
    <?php 
    
    class Queen{
        // 多少皇后
        public $n;
        // 记录多少种摆法
        public $count;
        //
        public $stack;
    
        public function __construct($n=8){
            $this->n=$n;
            $this->stack = new SplStack();
        }
    
        //摆放n皇后
        public function place($n=8){
            //结束条件,找到一个解
            if($this->stack->count() == $this->n ){
                $this->count++;
                $this->map($this->stack);
                return;
            }
            //摆放第n个皇后,探索水平方向值
            for ($i=0; $i < $this->n ; $i++) { 
                //探索水平位置,值为$i
                $this->stack->push($i);
                if($this->check()){
                    $this->place($n-1);
                }
                //探索水平位置下个值
                $this->stack->pop();
            }
        }
    
        public function check(){
            for ($i=1; $i < $this->stack->count() ; $i++) { 
                if($this->stack[$i] == $this->stack[0] || abs($this->stack[$i]-$this->stack[0]) == $i){
                    return false;
                }
            }
            return true;
        }
        public function map(){
            echo "<table>";
            for ($i=0; $i < $this->n; $i++) { 
                echo "<tr>";
                for ($j=0; $j < $this->n; $j++) { 
                    echo "<td>";
                    if($this->stack[$i]==$j){
                        echo "Q";
                    }
                    echo "</td>";
                }
                echo "</tr>";
            }
            echo "</table>";
        }
    
    }
    
    $n=8;
    $q =  new Queen($n);
    $q->place($n);
    echo "<table><tr><td class='count'>一共有 $q->count 个摆法。</td></tr></table>";
    ?>
    <style>
        table{
            margin:15px 15px;
            float:left;
        }
        td{
            width: 15px;
            height: 15px;
            border:1px solid red;
        }
        .count{
            width:150px;
        }
    </style>

    5、用php敲算法问题的好处是什么?

    结果可以以网页的形式美观的打印出来

    二、内容在总结中

     
  • 相关阅读:
    面向对象的继承关系体现在数据结构上时,如何表示
    codeforces 584C Marina and Vasya
    codeforces 602A Two Bases
    LA 4329 PingPong
    codeforces 584B Kolya and Tanya
    codeforces 584A Olesya and Rodion
    codeforces 583B Robot's Task
    codeforces 583A Asphalting Roads
    codeforces 581C Developing Skills
    codeforces 581A Vasya the Hipster
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/10879238.html
Copyright © 2011-2022 走看看