利用栈和队模拟一个停车场(数据结构报告)

二.实验内容:

题目:模拟停车厂管理

问题描述:

设停车厂只有一个可停放5辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走。

基本要求:

以栈模拟停车场,以队列模拟车场外的便道,按照从终端输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车辆离去,则输出车辆在停车场内停留的时间和应缴纳的费用(1小时以内不收费,1小时以上收费标准为2元/小时,在便道上停留的时间不收费)。栈以顺序结构出现,队列以链表结构实现。

测试数据:

(1)连续有7辆车到来,牌照号分别为JF001、JF002、JF003、JF004、、JF005、JF006、JF007,前5辆车应该进入停车位1-5车位,第6、7辆车应停入便道的1、2位置上。

(2)(1)中的情况发生后,让牌照号为JF003的汽车从停车厂开走,应显示JF005、JF004的让路动作和JF006从便道到停车位上的动作。

(3)随时检查停车位和便道的状态,不应该出现停车位有空位而便道上还有车的情况。

(4)程序容错性的测试,当按键输入错误的时候是否有错误提示给用户指导用户正确操作,并作出相应处理保证程序健康的运行。

三. 实验方案

(一)算法设计思路:

1、停车场:停车场用顺序栈表示,其中每个park为一个车位,其类型为carmes型包括车牌和到达离开信息,如停车场入栈出停车场出栈。

2、便道:便道使用链队,每个LNode包含carmes类型的cartrack车道和next指针,每个LNode节点和front、rear指针组合成为LQueue类型的链队。

3、使用的实现:如果停车场已满,要求先进入便道等待,如果停车场有空位则便道的front入车场,用户在停车前输入车牌与到达时间等信息,停车场出车时从最后一辆一辆一辆出车,用temp_car[]数组记录暂时让车的车辆。当车辆离开后其离开时间为便道入车场的到达时间。由于链队和栈的Out操作形参都需要car类型,但出来的操作无需car,特引入ghostcar函数建立一个没有内容的车辆保证运行。如果选择不使用形参car会造成返回值carmes*的指针混乱。

(二)使用模块及变量的说明(例如结构体的定义、含义)

typedef struct carmes {

   string carplot[10];

   float arrive;

   float leave;

}carmes;  建立一个包含车辆信息的结构体carmes,链队和栈中存放的都是carmes类型数据。

carmes* ghostcar(){

   carmes* car;

   car = (carmes*)malloc(sizeof(carmes));

   car->carplot[10]='0';

   car->arrive=0;

   return car;

}    由于链队和栈的Out操作形参都需要car类型,但出来的操作无需car,特引入ghostcar函数建立一个没有内容的车辆保证运行。如果选择不使用形参car会造成返回值carmes*的指针混乱。

temp_plot[]存放用来比较的车牌。

temp_car[]存放暂时让车的车辆。

四. 实验步骤或程序(经调试后正确的源程序)

#include "stdafx.h"

#include

using namespace std;

#include

typedef struct carmes {

   string carplot[10];

   float arrive;

   float leave;

}carmes;

typedef struct {

   carmes park[4];

   int top;

}SeqStack;

typedef struct node {

   carmes cartrack;

   struct node* next;

}QNode;

typedef struct {

   QNode* front, * rear;

}LQueue;

SeqStack* Init_SeqStack()

{

   SeqStack* s;

   s = (SeqStack*)malloc(sizeof(SeqStack));

   s->top = -1;

   return s;

};

carmes* new_car()

{

   carmes* car;

   car = (carmes*)malloc(sizeof(carmes));

   cout << "请输入车牌号";

   cin >> car->carplot[10];

   cout << "输入到达到达时间";

   cin >> car->arrive;

   return car;

};

void printcar(carmes car)

{

   cout << "********************************" << endl;

   cout << "车牌为 :" << car.carplot;

   cout << "到达时间为 " << car.arrive;

   cout << "********************************" << endl;

}

carmes* ghostcar(){

   carmes* car;

   car = (carmes*)malloc(sizeof(carmes));

   car->carplot[10]='0';

   car->arrive=0;

   return car;

}

carmes* Push_SeqStack(SeqStack* s, carmes* car) {

   if (s->top == 4)

   {

      cout << "停车场已满  先入便道等待";

      return car;

   }

   else {

      cout << "入车厂车辆信息为 :";

        printcar(*car);

      s->top++;

      s->park[s->top] = *car;

      return NULL;

   }

};

carmes* Out_SeqStack(SeqStack* s, carmes* car) {

   if (s->top == 0)

      return NULL;

   else

   {

      cout << "出栈车辆为:";

      printcar(s->park[s->top]);

      *car = s->park[s->top];

      s->top--;

      return car;

   }

};

LQueue* Init_LQueue() {

   LQueue* q;

   QNode* p;

   q = (LQueue*)malloc(sizeof(LQueue));

   p = (QNode*)malloc(sizeof(QNode));

   p->next = NULL;

   q->front = p;

   q->rear = p;

   return q;

};

void Push_LQueue(LQueue* q, carmes* car) {

   QNode* p;

   p = (QNode*)malloc(sizeof(QNode));

   p->cartrack = *car;

   p->next = NULL;

   q->rear->next = p;

   q->rear = p;

   printcar(*car);

};

carmes* Out_LQueue(LQueue* q,carmes*car) {

   QNode* p;

   if (q->front == q->rear)

   {

      cout << "便道无车 可直接入停车场";

      return NULL;

   }else

   {

      p = q->front->next;

      q->front->next = p->next;

      *car = p->cartrack;

      printcar(*car);

      free(p);

      if (q->front->next == NULL)

        q->rear = q->front;

      return car;

   }

}

void menu(LQueue*q,SeqStack*s)

{carmes*Ghost;

 Ghost=ghostcar();

   carmes* temp_car[4];

cout << "************************************ " << endl;

   cout << "请输入要选择的功能:" << endl;

   cout << "1、停车;" << endl;

   cout << "2、取车 " << endl;

cout << "3、查看此时停车场和便道车辆数量 " << endl;

cout << "0、退出 " << endl;

cout << "************************************ " << endl;

   int n;

   cin >> n;

   carmes* newcar;

   switch (n) {

   case 1: {newcar = new_car();

      if (Push_SeqStack(s, newcar))

        Push_LQueue(q, newcar); }

   case 2:{cout<<"请输入出车场车牌信息: ";

      string temp_plot[10];

      cin>>temp_plot[10];

      int i=0;

      while(temp_plot[10]!=s->park[i].carplot[10])

        i++;

      int j=4,k=0,x;

      for(j;j>=i;j--)

        {temp_car[k]=Out_SeqStack(s,Ghost);

            k++;}

      for(x=0;x

        Push_SeqStack(s,temp_car[x]);

   }

}

}

int _tmain(int argc, _TCHAR* argv[])

{LQueue*q=Init_LQueue();

   SeqStack *s=Init_SeqStack();

   menu(q,s);

   system("pause");

   return 0;

}

  • 程序运行结果(程序运行结果的一些截图)

利用栈和队模拟一个停车场(数据结构报告)_第1张图片

利用栈和队模拟一个停车场(数据结构报告)_第2张图片

六.实验总结(调试过程中遇到哪些问题,怎么解决的)

这次的实验是这几次中规模最大的也是最难的,这次的实验是对栈和队的综合运用,一些基本的操作如建立空栈空队列我都使用课本上的算法,再编写一个menu函数对各个函数进行模块间的协调合作,模块化的操作让我的代码出现问题可以及时定位与修改。在这个过程中我发现自己指针的使用很不熟练,总是出现无法从carmes类型无法转换为carmes*的错误,这是对指针使用不恰当的后果,同时还有s->park[i].carplot[10],我之前总是写成s->park[i].carplot[10],因为park[i]的类型为carmes型包含carplot,但不是指针不能使用->因为对指针使用不当,不得不制造出ghostcar这一函数满足程序运行需求。

你可能感兴趣的:(c++,数据结构)