一、設計內容
- 設計有一個可以停放n輛汽車的狹長停車場,它只有一個大門可以供車輛進出,車輛按照到達停車場時間的先后次序依次從停車場最里面向大門口出停放(即最先到達的第一輛車停放在停車場最里面),如果停車場已放滿n輛車,則以后到達的車輛只能在停車場大門外的便道上等待,一旦停車場內有車離開,則排在便道上的第一輛車可以進入停車場,停車場內如有某輛車要開走,則在它之后進入停車場的車都要先退出停車場為它讓路,待其開出停車場后,這些車輛再按照原來的次序進場。
二、設計分析
1.實現停車場的結構
??? 因為停車場它只有一個大門可以供車輛進出,車輛按照到達停車場時間的先后次序依次從停車場最里面向大門口出停放(即最先到達的第一輛車停放在停車場最里面),很容易讓人聯想的棧,所以我們停車場內部用棧來實現。如果停車場已放滿n輛車,則以后到達的車輛只能在停車場大門外的便道上等待,一旦停車場內有車離開,則排在便道上的第一輛車可以進入停車場,那么很明顯停車場外的便道是一個隊列的結構,先進先出,也就是先到先進。這樣就確定了停車場的基本機構,即停車場內用棧來貯存,停車場外便道用隊列來貯存。
2.停車場的功能
??? 個人認為一個停車場該有的功能:
1.車輛開進停車場
2.車輛開出停車場
3.查詢停車場內車的數量
4.查詢停車場內車的編號
5.查詢停車場外車的數量
6.查詢停車場外車的編號
7.查詢停車場內是否有空余
8.查詢停車場外一輛車需等待幾輛車
-
- 第一個功能是車輛開進停車場,這是一個停車場最基本的功能,實現對車輛的停放。
- 第二個功能是車輛開出停車場,這個功能值得注意的是,開出停車場的車輛可以是停在停車場的任意一輛,并且車輛開出去后,所有在這輛車開進之后的車輛均要向前移位,最后還需要判斷停車場外(即便道內)是否有車可以停進停車場內。
- 第三個功能是查詢停車場內車的數量,這個功能其實在功能4—查詢停車場車的編號就可以看出來,但假如數字過大,人為計數就會顯得復雜,所以增加這個功能能讓停車場車的數量很清晰呈現在我們面前。
- 第四個功能是查詢停車場內車的編號,首先這個編號順序應該是車輛停入的先后時間確定,其次,我們有了這個功能,我們實現車輛開出停車場時,能很明顯感受到車輛的變化。
- 第五個功能是查詢停車場外車的編號,因為停車場外并沒有規定能容納多少車輛,所以這個功能是作為一個參考。
- 第六個功能是查詢停車場外車的編號(是由進入停車場的優先順序進行輸出),這樣我們就可以清楚的觀察當有停車場外車進入停車場時,停車場外車輛的變化。
- 第七個功能是查詢停車場內是否有空余,這樣就可以給開入停車場的車輛提示,是否它們能開進停車場。
- 第八個功能是查詢停車場外一輛車需等待幾輛車,停車場外的車輛時任意的,沒有要求的,我們只需要你給出車的編號,我們就可以查詢車輛前方需等帶幾輛車,這樣就可以給暫時不能停入停車場的車輛一個時間預期。
3.停車場代碼的實現
??? 一.構建停車場內棧結構和停車場內隊結構:一開始我想用結構體動態模擬一個棧和隊列,但是兩個結構的動態構建會讓代碼很復雜,而且所需的空間和時間復雜度都很高,所以我換用數組靜態模擬棧和隊列,不僅節省了大量空間,也提高了時間效率,增加了代碼的簡潔性和可讀性。
-
-
- 構建停車場內棧結構:我用靜態數組模擬棧的實現,首先定義一個stk[]數組,里面貯存的值是車輛的編號,再定義int tt,tt類似于棧的頭指針,當有元素進棧棧,棧頂指針往后移,并將元素值賦予stk[tt],簡化可以寫為stk[++tt]=m,這樣我們就實現了棧的功能,比如棧內元素個數就等于tt,stk[tt]就是最后一輛車的編號。
- 構建停車場外的隊列結構:我也是用數組靜態模擬來實現隊列結構。首先定義數組q[],int hh=0,int gg=-1,數組q里面貯存的也是車輛的編號,hh類似于頭指針,gg類似于尾指針,這樣我就構建了一個隊列結構。比如,隊內的元素個數為:gg-hh+1,q[hh]代表隊頭元素,hh--表示出隊。
-
二.實現停車場功能的結構:我選擇采用主菜單的格式呈現再頁面上,然后你無論如何都要進行一次操作,我就采用了do-while循環,循環內部使用switch-case結構一一對應每種操作,并且加入default來判斷是否正確輸入操作編號。
三.實現停車場的功能:
-
-
- 車輛開進停車場:首先我們應該判斷停車場內是否有空位,有的話車輛停入停車場內,否側車輛停入停車場外側便道內,所以我們可以將功能1和功能7結合在一起實現,因為tt代表棧中元素個數,如果tt<n的話,即停車場內有空余,可以停進停車場,否側停進外側便道,我們每停入一輛車就相當與進棧即stk[++tt]=m,再讓tt與n進行判斷。
- 車輛開出停車場:首先要判斷你想要開出的車輛是否再停車場內,如果在就將車開出停車場,否側提示重新輸入。其次車輛開出停車場需要在它之后開進停車場的車讓路,我的做法是將我需要開出的那輛車進行移位,將它移入棧頭,在tt—將它出棧,它后面的車都前進一位。最后我們還要將隊列中的車進棧,停車場開出一輛車有一個空余,我先判斷隊列中是否有車,即隊列是否為空(hh<=gg),隊列空就就不需要出隊,反之,需要將對頭元素進入棧頭stk[++tt]=q[hh++]。這樣我就完成了整個車輛開出停車場的過程。
- 查詢停車場內車的數量:這個很簡單,直接輸出tt即可。
- 查詢停車場內車的編號:對我的棧進行一次循環遍歷即可。
- 查詢停車場外車的數量:這個也很簡單,直接輸出gg-hh+1即可。
- 查詢停車場外車的編號:也是對隊列進行一次循環遍歷即可。
- 查詢停車場內是否有空余:結合功能i實現。
- 查詢停車場外一輛車需等待幾輛車:首先判斷停車場外是否有車,即隊不為空,再進一步查詢車輛編碼是否存在,我用一個變量flag=1進行判斷,對隊列進行一次循環遍歷,如果能查找到相同的編號,就讓flag=0,最后通過flag判斷是否存在,最后一定要回溯,讓flag再次等于1,不然下次判斷的時候會判斷失誤。查詢車輛編碼時,我再用變量count進行計數,從隊頭開始查找,如果沒找到count++,找到直接就break結束循環。
-
四、代碼展示
#include <iostream>using namespace std;int stk[100000],q[100000],tt=0,hh=0,gg=-1;int main()
{int n,x,m,k,flag = 1;;cout << "請輸入停車場的容量" << endl;cin >> n;do{cout << "----------------------------------------------" << endl;cout << "---***課程設計-停車場管理系******************---" << endl;cout << "---***請輸入你的操作***********************---" << endl;cout << "---***1.車輛開進停車場*********************---" << endl;cout << "---***2.車輛開出停車場*********************---" << endl;cout << "---***3.查詢停車場內車的數量***************---" << endl;cout << "---***4.查詢停車場內車的編號***************---" << endl;cout << "---***5.查詢停車場外車的數量***************---" << endl;cout << "---***6.查詢停車場外車的編號***************---" << endl;cout << "---***7.查詢停車場外一輛車需等待幾輛車*****---" << endl;cout << "---***0.結束操作***************************---" << endl; cout << "----------------------------------------------" << endl;cin >> x;switch(x){case 1:cout << "請輸入開進車的編號" << endl;cin >> m;if(tt<n){cout << "停車場內有空余,車輛可以開進停車場" << endl;stk[++tt] = m;}else {cout << "停車場內沒有空余,車輛請開進便道等待" << endl;q[++gg] = m; } break;case 2:cout << "請輸入第幾輛車開出停車場" << endl;cin >> k;if(tt==0) cout << "停車場目前沒有車,無法開出停車場" << endl;else{if(k==tt) {cout << "停車場內有車,可以開出停車場,編號為" << stk[tt] << endl;tt--;}else{int j;cout << "停車場內有車,可以開出停車場,編號為" << stk[k] << endl;for(int i=k;i<tt;i++) {j = stk[i];stk[i] = stk[i+1];stk[i+1] = j;}tt--;} } if(hh<=gg&&tt<=n) {cout << "便道內有車,可以開進停車場" << endl;cout << "開進停車場的車編號為" << q[hh] << endl; stk[++tt] = q[hh++];}else cout << "便道內無車,車輛可以直接開進停車場" << endl;break;case 3:if(tt<n) {cout << "目前停車場內車編號為:" << tt << endl;cout << "車未停滿,可以在開進車輛" << endl;}else {cout << "目前停車場內車有:" << tt << endl;cout << "車已停滿,請開進便道" << endl;}break;case 4:cout << "停車場內的車編號為:(按開進時間快慢)" << endl; for(int i=1;i<=tt;i++)cout << stk[i] << ' ';cout << endl; break;case 5:if(hh<=gg)cout << "便道內有車,數量為:" << gg-hh+1 << endl;elsecout << "便道內無車,可以直接開進停車場" << endl; break;case 6:cout << "停車場外車的編號為:(按先進停車場的順序)" << endl;for(int i=hh;i<=gg;i++)cout << q[i] << ' ';cout << endl;break;case 7:cout << "請輸入停車場外任意一個車的編號" << endl;cin >> m; if(hh>gg) cout << "便道內沒有車!無法查詢." << endl;else {for(int i=hh;i<=gg;i++)if(q[i]==m) flag=0; if(flag) cout << "便道內沒有該車,請重新輸入" << endl;else {cout << "便道內有該車" << endl; int count = 0;for(int i=hh;i<=gg;i++){if(q[i]==m) break;else count++;}if(count==0) cout << "下一輛進停車場的車就是你" << endl;else cout << "你還需要等待" << count << "車" << endl;}flag = 1;} break;case 0: break;default: cout << "輸入錯誤!請重新輸入!" << endl;break;}}while(x);return 0;
}