* @date 2017/10/16 * @license MIT * ------------------------------------------------------------- * [æ çå®ä¹] * ======= * æ (Stack)ï¼æ¯éå¶å¨è¡¨çä¸ç«¯è¿è¡æå ¥åå 餿ä½ç线æ§è¡¨ãå称为åè¿å åºLIFO (Last In First Out)æå è¿ååºFILO (First In Last Out)线æ§è¡¨ã * æ é¡¶(Top)ï¼å 许è¿è¡æå ¥ãå 餿ä½çä¸ç«¯ï¼å称为表尾ãç¨æ é¡¶æé(top)æ¥æç¤ºæ é¡¶å ç´ ã * æ åº(Bottom)ï¼æ¯åºå®ç«¯ï¼å称为表头ã * 空æ ï¼å½è¡¨ä¸æ²¡æå ç´ æ¶ç§°ä¸ºç©ºæ ã * [æ çå®ç°æ¹å¼] * ======= * - ç¡¬å æ ï¼å©ç¨CPUä¸çæäºå¯åå¨ç»æç±»ä¼¼ç硬件æä½¿ç¨å åçç¹æ®åºåæ¥å®ç°ãè¿ç±»å æ 容éæéï¼ä½é度å¾å¿«ï¼ * - è½¯å æ ï¼è¿ç±»å æ 主è¦å¨å åä¸å®ç°ãå æ 容éå¯ä»¥è¾¾å°å¾å¤§ãå¨å®ç°æ¹å¼ä¸ï¼åæå¨ææ¹å¼åéææ¹å¼ä¸¤ç§ * ------------------------------------------------------------- * [å®ä¹] * ======= * 线æ§è¡¨(Linear List) ï¼æ¯ç±n(nâ§0)ä¸ªæ°æ®å ç´ (ç»ç¹) [a1ï¼a2ï¼ â¦an] ç»æçæéåºåãæ°æ®å ç´ æ¯ä¸ä¸ªæ½è±¡ç符å·ï¼å ¶å ·ä½å«ä¹å¨ä¸åçæ åµä¸ä¸è¬ä¸åã * 该åºåä¸çææç»ç¹å ·æç¸åçæ°æ®ç±»åãå ¶ä¸æ°æ®å ç´ ç个æ°n称为线æ§è¡¨çé¿åº¦ã * å½n=0æ¶ï¼ç§°ä¸ºç©ºè¡¨ã * å½n>0æ¶ï¼å°é空ç线æ§è¡¨è®°ä½ï¼ (a1ï¼a2ï¼â¦an) a1称为线æ§è¡¨ç第ä¸ä¸ª(é¦)ç»ç¹ï¼an称为线æ§è¡¨çæåä¸ä¸ª(å°¾)ç»ç¹ã * ------------------------------------------------------------- * [线æ§è¡¨é¡ºåºåå¨] * ======= * æçº¿æ§è¡¨çç»ç¹æé»è¾é¡ºåºä¾æ¬¡åæ¾å¨ä¸ç»å°åè¿ç»çåå¨åå éï¼ç¨è¿ç§æ¹æ³åå¨ç线æ§è¡¨ç®ç§°çº¿æ§è¡¨ã * ------------------------------------------------------------- * [顺åºåå¨ç线æ§è¡¨çç¹ç¹] * ======= * - 线æ§è¡¨çé»è¾é¡ºåºä¸ç©ç顺åºä¸è´ï¼ * - æ°æ®å ç´ ä¹é´çå ³ç³»æ¯ä»¥å ç´ å¨è®¡ç®æºå âç©çä½ç½®ç¸é»âæ¥ä½ç°ã * ------------------------------------------------------------- * @param array */ class StackExample { /** * @var null æ å ç´ */ protected $elem; /** * @var null ä¸ä¸ä¸ªèç¹ */ protected $next; /** * @var int æ é¿åº¦ */ protected $length; /** * åå§åæ * StackExample constructor. */ public function __construct() { $this->elem = $this->next = null; $this->length = 0; } /** * å¤ææ æ¯å¦ç©ºæ * * @return boolean å¦æä¸ºç©ºæ è¿åtrue,å¦åè¿åfalse */ protected function getIsEmpty() { return $this->elem ? false : true; } /** * å°ææå ç´ åºæ * * @return array è¿åæææ å å ç´ */ protected function getAllPopStack() { $result = array (); if ($this->getIsEmpty()) { return $result; } while ($this->elem != null) { $result[] = $this->elem->elem; $this->elem = $this->elem->next; } $this->length = 0; return $result; } /** * è¿åæ å å ç´ ä¸ªæ° * * @return int */ protected function getLength() { return $this->length; } /** * å ç´ è¿æ * * @param mixed $element è¿æ å ç´ å¼ * @return void **/ protected function setPushStack($element) { $stack = new stdClass(); $stack->elem = $element; $stack->next = $this->elem; $this->elem = &$stack; $this->length++; } /** * å ç´ åºæ * * @return boolean åºæ æåè¿åtrue,å¦åè¿åfalse **/ protected function getPopStack() { if ($this->getIsEmpty()) { return false; } $node = $this->elem; $this->elem = $node->next; $this->length--; } /** * ä» è¿åæ å ææå ç´ * * @return array æ å ææå ç´ ç»æçä¸ä¸ªæ°ç» */ protected function getAllElem() { $result = array (); if ($this->getIsEmpty()) { return $result; } $node = $this->elem; while ($node != null) { $result[] = $node->elem; $node = $node->next; } return $result; } /** * è¿åæ å æä¸ªå ç´ çä¸ªæ° * * @param mixed $elem å¾ æ¥æ¾çå ç´ çå¼ * @return int **/ protected function getCountForElem($elem) { $result = $this->getAllElem(); $count = 0; foreach ($result as $value) { if ($elem === $value) { $count++; } } return $count; } /** * è°è¯ç¨è¯·æ è§ * * @param $name * @param $arguments * @return mixed */ public function __call($name, $arguments) { $this->preDispatch(); // è°è¯ç¨ï¼è¯·æ è§ return call_user_func_array(array ($this, $name), $arguments); } /** * è°è¯ç¨ * * @param bool $isDebug * @return bool */ protected function preDispatch($isDebug = true) { if (!$isDebug) { return false; } $debug = debug_backtrace()[1]; $reflection = new ReflectionMethod($this, $debug['args'][0]); $args = ''; if (isset($debug['args'][1])) { foreach ($debug['args'][1] as &$value) { if (is_array($value)) { $args .= json_encode($debug['args'][1]) . ', '; } else { $args .= $value . ', '; } } } $args = trim($args, ', '); echo "\t" . $reflection->getDocComment() . PHP_EOL; echo "\t{$debug['args'][0]}({$args})\n" . PHP_EOL; } } $echo = function ($str, $action) { echo $str . "\t->\t" . var_export($action, true) . PHP_EOL; echo "--------------------------- " . PHP_EOL; }; //$stack = new StackExample(); //$stack->setPushStack('First'); //$stack->setPushStack('Second'); //$echo('è¿åæ å ææå ç´ ', $stack->getAllElem()); //$stack->setPushStack('Third'); //$echo('è¿åæ å ææå ç´ ', $stack->getAllElem()); //$stack->getPopStack(); //$echo('è¿åæ å ææå ç´ ', $stack->getAllElem());