停車場的模擬管理(資料結構 C++)
[問題描述]:
設有一個可以停放n輛汽車的狹長停車場,它只有一個大門可以供車輛進出。車輛到達停車場時間的早晚依次從停車場最裡面向大門口處停放(最先到達的第一輛車放在停車場最裡面)。如果停車場已放滿n輛車,則後來的車輛只能停在停車場大門外的便道上等待,一旦停車場裡有車開走,則排在便道上的第一輛車就進入停車場。若停車場內有某輛車要開走,在它之後進入停車場的車都必須先退出停車場,為它讓路,待其開出停車場後,這些車再依原來的次序進場。每輛車離開停車場
時,都應根據其在停車場的逗留時間交費。如果停留在便道上的車未進停車場就要離去,允許其離去,不收停車費,並且仍然保持在便道上等待的車輛順序。編制一程式模擬停車場的管理。
【實現要求】
1、要求程式輸出每輛車到達後的停車位置(停車場)或便道上;
2、某輛車離開停車場時應交納的費用和停留時間;
程式設計
#include "stdio.h"
#include "stdlib.h"
#define A 5 /* 停車單價 */
#define TRUE 1
#define FALSE 0
#define NULL 0
#define Stack_Size 2 /* 車庫容量 */
typedef struct
{
int elem1[Stack_Size];
int elem2[Stack_Size];
int elem3[Stack_Size];
int elem4[Stack_Size];
int top;
}SeqStack; /* 定義棧的結構體 */
typedef struct Node
{
int date;
int num;
int hour;
int minute;
struct Node *next;
}LinkQueueNode; /* 定義鏈佇列結點的結構體 */
typedef struct
{
LinkQueueNode *front;
LinkQueueNode *rear;
}LinkQueue; /* 定義鏈佇列的結構體*/
InitQueue(LinkQueue *Q) /* 初始化鏈佇列函式 */
{
Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if(Q->front!=NULL)
{
Q->rear=Q->front;
Q->front->next=NULL;
return(TRUE);
}
else return(FALSE);
}
EnterQueue(LinkQueue *Q,int x,int y,int z,int w) /* 入鏈佇列函式 */
{
LinkQueueNode *NewNode;
NewNode=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if(NewNode!=NULL)
{
NewNode->num=x;
NewNode->date=y;
NewNode->hour=z;
NewNode->minute=w;
NewNode->next=NULL;
Q->rear->next=NewNode;
Q->rear=NewNode;
return(TRUE);
}
else return(FALSE);
}
DeleteQueue(LinkQueue *Q,int *x,int *y,int *z,int *w) /* 刪除鏈佇列結點函式 */
{
LinkQueueNode *p;
if(Q->front==Q->rear)
{
return(FALSE);
}
p=Q->front->next;
Q->front->next=p->next;
if(Q->rear==p)
{
Q->rear=Q->front;
}
*x=p->num;
*y=p->date;
*z=p->hour;
*w=p->minute;
free(p);
return(TRUE);
}
void InitStack(SeqStack *S) /* 初始化棧 */
{
S->top=-1;
}
int Push(SeqStack *S,int x,int y,int z,int w) /* 棧插入函式 */
{
S->elem1[S->top]=x;
S->elem2[S->top]=y;
S->elem3[S->top]=z;
S->elem4[S->top]=w;
S->top++;
return(TRUE);
}
int Pop(SeqStack *S,int *x,int *y,int *z,int *w) /* 棧刪除函式 */
{
if(S->top==-1)
{
return(FALSE);
}
else {
S->top--;
*x=S->elem1[S->top];
*y=S->elem2[S->top];
*z=S->elem3[S->top];
*w=S->elem4[S->top];
return(TRUE);
}
}
int IsFull(SeqStack *S) /* 判斷棧滿函式 */
{
return(S->top==Stack_Size-1?TRUE:FALSE);
}
int IsEmpty(SeqStack *S) /* 判斷棧滿函式 */
{
return(S->top==-1?TRUE:FALSE);
}
int choose() /* 選擇函式 */
{
int m;
printf(" 請選擇:1. 停車; 2. 停車場出車; 3. 便道出車;4.退出 ");
scanf("%d",&m);
if(m==1||m==2||m==3)
{
return(m);
}
if(m==4)
{
exit(0); /* 整個程式由此結束 */
}
else
{
printf("選擇錯誤!");
exit(1);
}
}
void main()
{
int m,num,pp=1,k=0,p=0,x,y,z,w,t ,date,hour,minute;
LinkQueue *Q=(LinkQueue*)malloc(sizeof(LinkQueue));
SeqStack *S=(SeqStack*)malloc(sizeof(SeqStack)),*R=(SeqStack*)malloc(sizeof(SeqStack));
InitQueue(Q);
InitStack(R);
InitStack(S);
while(pp!=0) /* 控制程式一直迴圈 */
{
m=choose(); /* 整個程式由此進 */
printf("請輸入汽車號碼: ");
scanf("%d",&num);
printf("請輸入時間:例:20,7:35表示某月20日7:35停車或出車 ");
scanf("%d,%d:%d",&date,&hour,&minute);
if(m==1)
{
printf("No.%d 號汽車停在 ",num);
if(IsFull(S)) /* 先判斷車庫是否滿了 */
{
EnterQueue(Q,num,date,hour,minute); /* 如果滿了,則放入便道里(鏈佇列) */
k++; /* 便道里的位置計數器 */
printf("便道中的第 %d 號位置. ",k);
}
else
{
Push(S,num,date,hour,minute); /* 如果不滿,則放入車庫裡(順序棧) */
p++; /* 車庫裡的位置計數器 */
printf("停車場的第 %d 號位置! ",p);
}
}
if(m==2)
{
if(IsEmpty(S)) /* 判斷車庫還有車嗎,其作用為防止非法輸入 */
{
printf("車庫為空,No.%d 不在!",num);
exit(2);
}
while(num!=S->elem1[S->top]) /* 尋找所要出的車 */
{
Pop(S,&x,&y,&z,&w); /* 車庫最外輛車出庫 */
while(p>0)
{
p--; /* 出車則減一個數 */
}
Push(R,x,y,z,w); /* 將剛出的車入臨時車庫(順序棧) */
}
Pop(S,&x,&y,&z,&w); /* 找到車後將其彈出 */
p--; /* 出車則減一個數 */
t=(date-y)*1440+(hour-z)*60+minute-w; /* 計算其停車時間 */
printf("No.%d 的車在車庫停了 %d 分鐘.$:%d ",num,t,t*A);
while(!IsEmpty(R))
{
Pop(R,&x,&y,&z,&w);
Push(S,x,y,z,w);
p++;
} /* 將臨時車庫的車全部轉到車庫 */
if(Q->front!=Q->rear) /* 判斷便道是否有車 */
{ DeleteQueue(Q,&x,&y,&z,&w); /* 如果有則出便道 */
Push(S,x,y,z,w); /* 進車庫 */
p++; /* 車庫計數器加1 */
k--; /* 便道計數器減1 */
}
}
if(m==3)
{
DeleteQueue(Q,&x,&y,&z,&w);
k--;
t=(date-y)*1440+(hour-z)*60+minute-w;
printf("No.%d 的車在便道停了 %d 分鐘.",num,t);
}
}
}
相關文章
- 【資料結構】停車場問題資料結構
- 資料結構棧和佇列排隊演算法應用的例子【停車場停車位排隊管理系統】資料結構佇列演算法
- 停車場管理
- 小車側方位停車過程的動態模擬matlab模擬Matlab
- fastmock模擬常見資料結構ASTMock資料結構
- 停車場結構圖怎麼做,地下停車場怎麼畫簡單又好看
- 停車場結構圖怎麼畫,自己畫停車位需要什麼工具
- 基於深度學習的停車場車輛檢測演算法matlab模擬深度學習演算法Matlab
- 演算法與資料結構 1 - 模擬演算法資料結構
- C++資料結構和pb資料結構的轉換C++資料結構
- 智慧停車場停車怎麼找車
- 在停車場找不到車了怎麼辦?停車場停車怎麼找車?
- 在停車場怎麼找車?地下停車場怎麼找到自己的車?
- c++基本資料結構C++資料結構
- 停車場構造圖怎麼畫好看,簡單的停車場地圖怎麼畫圖地圖
- 2020秋資料結構實驗第一題:兔子數列模擬(斐波那契數列模擬)C++實現資料結構C++
- 智慧停車場
- C++資料結構連結串列的基本操作C++資料結構
- C++資料結構-佇列C++資料結構佇列
- 資料結構之堆(c++)資料結構C++
- 停車場無人看管智慧停車系統怎麼停車和找車?
- 資料結構——單連結串列的C++實現資料結構C++
- 停車場智慧尋車系統,大型停車場智慧車位導航技術
- 高階停車場停車計費解決方案
- 怎樣查車停車什麼停車場技術分析
- 停車場室內導航怎麼用,停車場尋車是怎麼實現的
- 智慧停車怎麼實現的,停車場找車系統怎麼找車
- 730【畢設課設】基於STM32的RFID停車場車位車庫管理監測系統設計(全套資料)
- 停車場分佈圖怎麼畫,地下停車場的樓梯怎麼畫
- ES6 系列之模擬實現一個 Set 資料結構資料結構
- 智慧停車場專案
- 資料結構 - 單連結串列 C++ 實現資料結構C++
- 爬取廣州所有停車場資料(Python)(並行加速版本)Python並行
- SLM——模擬過程與資料管理平臺
- 【java】【集合】LinkedList的特有功能,用LinkList模擬棧和佇列資料結構Java佇列資料結構
- 什麼軟體畫停車場好用,停車場的地圖要怎麼畫才好看地圖
- 停車場導檢視怎麼做,簡單的停車場地圖怎麼畫好看地圖
- 停車場方點陣圖怎麼畫,停車場怎麼畫簡單一點的
- 停車場地圖怎樣好看,停車場怎麼畫簡單又漂亮地圖