資料結構棧和佇列排隊演算法應用的例子【停車場停車位排隊管理系統】

勺顛顛發表於2019-06-28

佇列的內容可以參考本人前面寫過的東西佇列結構的實現
棧的概念:
棧也是一種特殊的線性表結構,資料只能在某一端進行操作,能運算元據的那一端為棧頂,對應的為棧底,資料入棧的過程就是入棧【壓棧,進棧】,資料出棧的過程就是【彈棧,出棧】,遵循先進後出原則FIRST IN LAST OUT 即FILO結構,基於連續的記憶體單元則是順序棧表,一種是使用分散的記憶體單元儲存為鏈式結構即鏈棧結構。

本文基於這佇列和棧的資料結構使用PHP編寫的一個停車位排隊管理系統【小示例啦】
佇列資料結構+棧資料結構應用的例子【停車場停車位排隊管理系統】
佇列資料結構+棧資料結構應用的例子【停車場停車位排隊管理系統】
佇列資料結構+棧資料結構應用的例子【停車場停車位排隊管理系統】
進隊【隊尾】

佇列資料結構 + 棧資料結構應用的例子【停車場停車位排隊管理系統】

佇列資料結構 + 棧資料結構應用的例子【停車場停車位排隊管理系統】

下面是測試的PHP原始碼

<?php
/**
 * Created by PhpStorm.
 * User: 1655664358@qq.com
 * Date: 2019/6/28
 * Time: 10:04
 */
/**
 * 佇列+棧資料結構的停車排隊管理系統
 */
define("MAXSIZE",3);
$station   = [];//停車場棧
$parkTop   = 0;
$road      = [];//便道佇列
$roadFront = $roadNear = 0;//佇列遊標

class Car
{
    public $carNumber;
    public $arriveTime;
}

/**
 * 壓棧
 * @param $station
 * @param $parkTop
 * @param Car $car
 * @return int
 */
function push(&$station,&$parkTop,Car $car)
{
    if ($parkTop>=MAXSIZE){
        echo "停車場沒有位置了哦".PHP_EOL;
        return -1;
    }
    $station[$parkTop] = $car;
    echo "車牌號為:".$car->carNumber."的車主停車位為:".($parkTop+1).PHP_EOL;
    $parkTop++;
    return 1;
}

/**
 * 出棧
 * @param $station
 * @param $parkTop
 * @param $carNumber
 * @return Car
 */
function pop(&$station,&$parkTop,$carNumber)
{
    $location        = -1;
    $tempStation     = [];//臨時棧
    $tempLocation    = 0;
    $car             = new Car();
    $car->carNumber  = -1;
    $car->arriveTime = -1;
    for($i=0;$i<$parkTop;$i++){
        if ($station[$i]->carNumber==$carNumber){
            $location=$i;
            break;
        }
    }
    if ($location==-1){
        echo "停車場沒有這車";
    }else{
        while($parkTop>$location+1){
            $parkTop--;
            $tempStation[$tempLocation] = $station[$parkTop];
            $tempLocation++;
        }
        $parkTop--;
        $car = $station[$parkTop];
        while($tempLocation>0){
            $tempLocation--;
            $station[$parkTop] = $tempStation[$tempLocation];
            $parkTop++;
        }
    }
    return $car;
}
echo "歡迎使用停車位管理系統".PHP_EOL;
echo date("Y年-m月-d日 H時:i分:s秒").PHP_EOL;
while(1){

    echo "停車(A;離開(D;是否有空位(E;停車場車輛列表(L;退出#".PHP_EOL;
    $cmd = fread(STDIN,1);
    if ($cmd=='#'){
        echo "歡迎下次再來".PHP_EOL;
        break;
    }
    switch (trim($cmd)){
        case 'L':
            if ($parkTop>0){
                echo "|---車牌號---|---停車時間---|---車 位---|---區域---|".PHP_EOL;
                for($j=$parkTop-1;$j>=0;$j--){
                    echo "|---".$station[$j]->carNumber."---|---".$station[$j]->arriveTime.":00:00---|---".($j+1).' 號---|---車場---|'.PHP_EOL;
                }
            }
            if ($roadFront!=$roadNear){
                for($j=$roadFront;$j<$roadNear;$j++){
                    echo "|---".$road[$j]->carNumber."---|---".$road[$j]->arriveTime.":00:00---|---".($j+1).' 號---|---便道---|'.PHP_EOL;
                }
            }

            break;
        case "A":
            echo "請輸入車牌號和到達時間".PHP_EOL;
            $input = trim(fread(STDIN,10));
            fflush(STDIN);
            if (strpos($input,":")<-1){
                echo "輸入錯誤".PHP_EOL;
                break;
            }
            $input = explode(":",$input);
            if (count($input)<2){
                echo "車牌號和時間輸入錯誤".PHP_EOL;
                break;
            }

            $carNumber = $input[0];
            $arriveTime= (integer)$input[1];
            if (empty($arriveTime)){
                echo "時間輸入錯誤".PHP_EOL;
                break;
            }
            $car = new Car();
            $car->carNumber = $carNumber;
            $car->arriveTime = $arriveTime;
            $result = push($station,$parkTop,$car);
            if ($result==-1){
                $road[$roadNear] = $car;
                $roadNear++;
                echo "車牌為號:".$car->carNumber."的車停在了便道上的:".$roadNear.",位置上了".PHP_EOL;
            }
            break;
        case "E":
            if ($parkTop>=MAXSIZE){
                echo "目前沒有空位了,進來只能停在便道上了".PHP_EOL;
            }else{
                echo "有空位,停車費一個小時20美金".PHP_EOL;
            }
            break;
        case "D":
            echo "請輸入要離開的車牌號和離開時間".PHP_EOL;
            $input = trim(fread(STDIN,10));
            fflush(STDIN);
            if (strpos($input,":")<-1){
                echo "輸入錯誤".PHP_EOL;
                break;
            }
            $input = explode(":",$input);
            if (count($input)<2){
                echo "輸入錯誤".PHP_EOL;
                break;
            }
            $carNumber = $input[0];
            $arriveTime = $input[1];
            if (empty($arriveTime)){
                echo "輸入錯誤".PHP_EOL;
                break;
            }
            /** @var Car $car */
            $car = pop($station,$parkTop,$carNumber);
            if ($car->carNumber==-1){
                echo "停車場沒有你要找的車".PHP_EOL;
            }else{
                $time = $arriveTime-$car->arriveTime;
                echo "車牌號為:".$car->carNumber."的停車時間為:".$time."H,需要繳納:".($time*20)."美金停車費用".PHP_EOL;
                echo "車牌號為:".$car->carNumber."的車已經出來,停在便道上的車將進場".PHP_EOL;
                if ($roadFront!=$roadNear){
                    $car = $road[$roadFront];
                    echo "車牌號為:".$car->carNumber."的車請輸入到達時間".PHP_EOL;
                    $arriveTime = trim(fread(STDIN,5));
                    $car->arriveTime = $arriveTime;
                    $station[$parkTop] = $car;
                    $parkTop++;
                    $roadFront++;
                    echo "停在便道上的車牌為:".$car->carNumber."已經進入停車場了".PHP_EOL;
                }

            }
            break;
        default:
            break;
    }
}

相關文章