程序設計思想:
1.首先定義一個數據類型包含車牌號和進去的時間,這兩個車的信息。
2.定義棧一用來模仿停車場的入棧函數(其中包含入隊函數,棧滿則入隊),棧二用來儲存棧一出來元素的入棧函數。
3.兩個棧的有共同的出棧函數。
4.定義隊列(模仿便道)的入隊與出隊函數
5.在主函數中調用時間函數用來記錄時間
6.定義兩個棧和一個隊列,同時初始化。
7.提示用戶輸入車牌號,利用while不停的輸入(輸入的同時記下輸入時間),直到輸入end為止。
8.在while循環中給用戶提供進車,出車,結束的三個選擇。
9.出車: 提示用戶輸入出車的車牌號
10.將棧一的棧頂元素出棧,判斷是否與想要的車牌號一致,相同則執行下一步,不相同執行第十三步。
11.調用time函數記錄出車時間再減去入車時間得到停車時間,停車時間乘以倍數得到費用。
12.判斷便道上是否有車,有車則隊頭元素進入停車場,否則,提示用戶車場有空位。
13.利用while循環將棧一出來的元素儲存到棧二中,直到得到想要的車牌號,計算停車費用。
14.將棧二中的元素再返回到棧一中。
15.判斷隊列是否為空,若不為空將隊頭元素進入到棧一中,否則提示用戶停車場有空位。
16.入車: 判斷便道是否為空,若空判斷棧一是否已滿不滿,則進入停車場,提示進入成功,否則下一步。
17.車輛進入便道,提示: 停車場已經滿將車停在便道上
18.設置取棧頂元素函數,用來測試所有元素是否按設計思想移動。
遇到的問題:
1.程序的反復進出棧,入隊,出隊,比較繁瑣。
2.對於記錄一段時間的函數不會應用。
3.對於記錄時間的函數取整可能為0 ,導致收費為0,所以設置最低收費標准為1元。
4.對於邏輯判斷不太清楚。對於停車場內沒有找到車,輸出 該車不在停車場中 出現了問題。 因為要判斷是否棧的頂指針與頭指針是否重合,以及車牌是否找到,這兩個判斷間的與和或關系有點混亂.
5.對於判斷車輛沒有找到出現了問題,沒有解決。
啟發:
1.對於比較復雜但是有思路的程序一定要靜下心來仔細思考,不要把程序的編寫順延,等一會做會比現在做 要花費更大的時間和精力。
2.對於編程過程中的問題要及時記下,否則過一會就忘記了。
3.對於記錄一段時間函數的應用解決:
定義 clock_t start,finish; s
tart 用在程序的開始
finish 用在程序的結尾
time=(double)finish-start/CLOCKS_PER_SEC;
#include <iostream> #include <string> #include <ctime> using namespace std; #define max 3 typedef struct //定義車輛的信息數據類型,包括車牌號和進去時間 { //該程序只設計了兩個信息,利用車牌號將車取出,時間計算應該繳納的費用 string num; double time; }data; typedef struct //定義順序棧的數據類型 { data *base; data *top; int stacksize; }SqStack; typedef struct QNode //定義鏈隊的數據類型 { data point; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; void InitStack(SqStack &s) //順序棧的初始化函數 { s.base=new data[max]; if(!s.base) { cout<<"棧申請空間失敗,程序結束!"<<endl; exit(0); } s.top=s.base; s.stacksize=max; } void InitQueue(LinkQueue &q) //鏈隊的初始化函數 { q.front=q.rear=new QNode; q.front->next=NULL; } void EnQueue(LinkQueue &q,data e) //鏈隊的進隊函數 { QueuePtr p=new QNode; p->point=e; p->next=NULL; q.rear->next=p; q.rear=p; } void Push1(SqStack &s,data e,LinkQueue &q) //一棧的入棧函數 { if(s.top-s.base==s.stacksize) { EnQueue(q,e); } else { *s.top++=e; } } void Push2(SqStack &s,data e) //二棧的入棧函數,不用判斷是否棧滿 { *s.top++=e; } data Pop(SqStack &s) //兩個棧的出棧函數 { data e; e=*--s.top; return e; } data DeQueue(LinkQueue &q) //鏈隊的出隊函數,將判斷隊是否為空放在主函數中 { data e; QueuePtr p=new QNode; p=q.front->next; e=p->point; q.front->next=p->next; if(q.front==p) q.rear=q.front; delete p; return e; } data Get(SqStack s) //測試函數,檢測棧中元素是否正確的進出 { return *(s.top-1); } int main() { clock_t start, //定義時間用來計算車輛停留時間 finish; LinkQueue q; //鏈隊的定義和初始化 InitQueue(q); SqStack s1, //兩個順序棧的定義和初始化 s2; InitStack(s1); InitStack(s2); data e; cout <<"請輸入車輛的信息(車牌號,如果輸入完畢請輸入end點enter)"<<endl; while(e.num!="end") { cin>>e.num; start=clock(); //記錄進去的時間 e.time=start; Push1(s1,e,q); //入棧操作 } if(s1.top-s1.base==max) { cout<<"停車場只能停"<<max<<"輛車,多余的車輛進入便道!"<<endl; } int choice; data t1; string name; while(1) { cout <<"-------------------------------------------------------------------------------"<<endl; cout <<"1. 車輛出去 2 車輛進去 3. 結束"<<endl; cout <<"請輸入你的選擇:"; cin>>choice; if(choice == 3) { exit(0); } else if(choice==1) { cout <<"請輸入要出車的車牌號:"; cin>>name; t1=Pop(s1); if(t1.num==name) //判斷棧頂是否是要出的車輛 { finish=clock(); double money; //計算停車費用 money=(double)(finish-t1.time)/CLOCKS_PER_SEC; money=(int)money/10+1; cout<<"停車費用為:"<<money<<"元"<<endl; cout <<"車輛出去成功!"<<endl; //測試位置,檢測是否出車成功 if(q.front==q.rear) //判斷便道上是否有車 { cout <<"停車場有多余空間進車."<<endl; //沒有車則停車場產生空位 } else { Push2(s1,DeQueue(q)); //便道上有車則向停車場內補齊 cout <<"停車場沒有空位!"<<endl; } //測試位置,出車成功后檢測便道上的車是否進入停車場 } else { while(t1.num!=name&&s1.base!=s1.top) //頂上元素不是想要的元素,則將出棧元素儲存在棧二中 { //繼續向下尋找 Push2(s2,t1); t1=Pop(s1); } finish=clock(); double money; //計算時間 money=(double)(finish-t1.time)/CLOCKS_PER_SEC; money=(int)money/10+1; cout<<"停車費用為:"<<money<<"元"<<endl; cout <<"車輛出去成功!"<<endl; //尋找到則出車成功 while(s2.top!=s2.base) //將棧二內的元素放回到棧一中 { Push1(s1,Pop(s2),q); } //測試位置,判斷棧二中元素是否全都放回棧一中 if(q.front==q.rear) //出車成功后判斷便道上是否有車 { cout <<"停車場有多余空間進車."<<endl; //沒車則停車場產生空位 } else { Push2(s1,DeQueue(q)); //有車則向停車場中補齊 cout <<"停車場沒有空位!"<<endl; } } //測試位置,檢測便道上的車是否進入停車場中 } else if(choice == 2) { cout <<"請輸入您的車牌號:"; data d; cin>>d.num; if(q.front!=q.rear) { cout <<"停車場內部已滿,您的車只能停在便道上."<<endl; EnQueue(q,d); } else { if(s1.top-s1.base!=s1.stacksize) { Push1(s1,d,q); start=clock(); d.time=start; cout <<"您的車已成功停在停車場."<<endl; } else { cout <<"停車場內部已滿,您的車只能停在便道上."<<endl; EnQueue(q,d); } } } else { cout <<"無此功能!"<<endl; break; } } return 0; }