佇列的內容可以參考本人前面寫過的東西佇列結構的實現
棧的概念:
棧也是一種特殊的線性表結構,資料只能在某一端進行操作,能運算元據的那一端為棧頂,對應的為棧底,資料入棧的過程就是入棧【壓棧,進棧】,資料出棧的過程就是【彈棧,出棧】,遵循先進後出原則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;
}
}