數據結構之停車場


程序設計思想:  

  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;
}


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM