数据结构第二次上机作业。“停车场问题”
主要考察问题:
栈:
初始化栈
判断栈满
入栈
出栈
队列:
初始化链队列
判断链队列是否为空
链队列入队
链队列出队
总结细节问题:
string函数只能在C++函数中使用;
使用时要包含头文件#include<iostream>
#include<string>
要使用栈或者队列,用之前必须初始化栈或者队列;
在定义一个指针时,必须给他一个空间;
以下是源代码:
1 #include <stdio.h> 2 #include <malloc.h> 3 #include <string> 4 #include <iostream> 5 6 using namespace std; 7 8 #define MAX 2 9 #define TRUE 1 10 #define FALSE 0 11 12 /******************************************/ 13 /************** 结构体定义 ****************/ 14 /******************************************/ 15 16 typedef struct //车辆信息结构体 17 { 18 string number; //车牌号码 19 int time; //到达时刻 20 }Car; 21 22 typedef struct //顺序栈定义 23 { 24 Car elem[MAX]; //车辆信息结构体指针 ////////////// 25 int top; 26 }SeqStack; 27 28 typedef struct Node //链队列定义 29 { 30 Car data; //车辆信息域 31 struct Node *Next; //指针域 32 }LinkQueueNode; 33 34 typedef struct 35 { 36 LinkQueueNode *front; 37 LinkQueueNode *rear; 38 }LinkQueue; 39 40 SeqStack garage;//车库 41 SeqStack quit;//暂退车道 42 LinkQueue thendrive;//便车道 43 44 /**********************************************/ 45 /***************** 函数声明 *******************/ 46 /**********************************************/ 47 48 void InitStack(SeqStack *s);//初始化顺序栈 49 int IsEmpty(SeqStack *s);//判断栈满函数 50 int Push(SeqStack *s,int e);//入栈 51 int Pop(SeqStack *s,int *e);//出栈 52 53 54 void InitStack(SeqStack *s) 55 { 56 s->top=-1; 57 } 58 59 int IsEmpty(SeqStack *s) 60 { 61 if(s->top==-1) 62 return TRUE; 63 else 64 return FALSE; 65 } 66 67 int Push(SeqStack *s,string number,int time) 68 { 69 if(s->top>=2) 70 return FALSE; 71 else 72 { 73 s->top++; 74 s->elem[s->top].number=number; 75 s->elem[s->top].time=time; 76 } 77 return TRUE; 78 } 79 80 int Pop(SeqStack *s,Car *e) 81 { 82 if(s->top==-1) 83 return FALSE; 84 else 85 { 86 e->number=s->elem[s->top].number; 87 e->time=s->elem[s->top].time; 88 s->top--; 89 return TRUE; 90 } 91 } 92 93 94 int InitQueue(LinkQueue *Q); 95 int EmptyQueue(LinkQueue Q); 96 int EnterQueue(LinkQueue *Q,string number,int time); 97 int DeleteQueue(LinkQueue *Q,Car *x); 98 99 int InitQueue(LinkQueue *Q) //链队列初始化 100 { 101 Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode)); 102 if(Q->front!=NULL) 103 { 104 Q->rear=Q->front; 105 Q->front->Next=NULL; 106 return TRUE; 107 } 108 else 109 return FALSE; 110 } 111 112 int EmptyQueue(LinkQueue *Q) //判断链队列是否为空 113 { 114 if(Q->front==Q->rear) 115 return TRUE; 116 else 117 return FALSE; 118 } 119 120 int EnterQueue(LinkQueue *Q,string number,int time) //链队列入队操作 121 { 122 LinkQueueNode *NewNode; 123 NewNode=(LinkQueueNode *)malloc(sizeof(LinkQueueNode)); 124 if(NewNode!=NULL) 125 { 126 NewNode->data.number=number; 127 NewNode->data.time=time; 128 NewNode->Next=NULL; 129 Q->rear->Next=NewNode; 130 Q->rear=NewNode; 131 return TRUE; 132 } 133 else 134 return FALSE; //溢出 135 } 136 137 int DeleteQueue(LinkQueue *Q,Car *x) //链队列出队操作 138 { 139 LinkQueueNode *p; 140 if(Q->front==Q->rear) 141 return FALSE; 142 p=Q->front->Next; 143 Q->front->Next=p->Next; 144 if(Q->rear==p) 145 Q->rear=Q->front; 146 (*x)=p->data; 147 free(p); 148 return TRUE; 149 } 150 151 /**********************************************/ 152 void Come(string Number,int Time);//车辆到达函数 153 void Leave(string Number,int Time);//车辆离开函数 154 155 void Come(string Number,int ComeTime) 156 { 157 if(garage.top<2) 158 { 159 Push(&garage,Number,ComeTime); 160 } 161 else 162 { 163 EnterQueue(&thendrive,Number,ComeTime); 164 } 165 cout<<Number<<"当前停放在车库"<<garage.top+1<<endl; 166 } 167 168 void Leave(string Number,int LeaveTime) 169 { 170 Car *e=new(Car); 171 int cost;//停车费用 172 while((!IsEmpty(&garage))&&((garage.elem[garage.top].number)!=Number))//当"车库"栈不空,并且栈顶车辆不是要离开的车 173 { 174 Pop(&garage,e);//将"车库"栈的栈顶车辆退出 175 Push(&quit,e->number,e->time);//让退出的车辆进入"暂时退车道"栈 176 } 177 Pop(&garage,e); 178 cost=(LeaveTime-e->time)*5; 179 //将"暂时退车道"栈中的车辆倒回"车库"栈 180 while(!IsEmpty(&quit)) 181 { 182 Pop(&quit,e); 183 Push(&garage,e->number,e->time); 184 } 185 if(!EmptyQueue(&thendrive)) 186 { 187 DeleteQueue(&thendrive,e);//队头车辆出队 188 e->number=LeaveTime; 189 Push(&garage,e->number,e->time); 190 } 191 cout<<Number<<"停放时间为"<<LeaveTime-e->time<<"停车费用为"<<cost<<"元"<<endl; 192 } 193 194 void main () 195 { 196 int A; 197 string Number; 198 int Time; 199 InitStack(&garage); 200 InitStack(&quit); 201 InitQueue(&thendrive); 202 printf("请输入车辆信息(到达/离开,牌照号码,当前时刻):"); 203 cin>>A; 204 while(A!=-1) 205 { 206 207 cin>>Number>>Time; 208 if(A==1) 209 { 210 Come(Number,Time); 211 } 212 else 213 Leave(Number,Time); 214 cin>>A; 215 } 216 217 218 }
时间: 2024-10-09 22:04:11