#include<stdio.h>
#include<stdlib.h>
#define STACKSIZE 3
#define MAXSIZE 100
int n;
typedef struct data{
int num;
int time;
}Data;
typedef struct SeqStack //栈的储存结构
{
Data data[STACKSIZE];
int top;
}SeqStack;
typedef struct //队列的储存结构
{
Data data[MAXSIZE];
int rear;
int front;
}CirQueue;
// void InitQueue(CirQueue &Q) //初始化队列
// {
// Q.front=Q.rear=0;
// }
//
// int Queue(CirQueue &Q,Data x) //将X入队列
// {
// if((Q.rear+1)%MAXSIZE==Q.front)
// return 0; //队列已满
// else{
// Q.data[Q.rear]=x;
// Q.rear=(Q.rear+1)%MAXSIZE; //重新设置队尾指针
// return 1;
// }
// }
循环队列出队操作
//int DelQueue(CirQueue &Q,Data &x)
//{
// if(Q.front==Q.rear)
// return 0;x=Q.data[Q.front];
// Q.front=(Q.front+1)%MAXSIZE; //重新设置队头指针
// return 1;
// }
//初始化栈
void InitQueue(CirQueue &Q){
Q.front=Q.rear=0;
}
bool InQueue(CirQueue &Q,Data x){
if((Q.rear+1)%MAXSIZE==Q.front) //队列满了
return false;
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%MAXSIZE;
return true;
}
bool DelQueue(CirQueue &Q,Data &x)
{
if(Q.front==Q.rear)
return false;
x=Q.data[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return true;
}
void InitStack(SeqStack &S)
{
S.top=-1;
}
bool StackEmpty(SeqStack &S)
{
return S.top==-1?true:false;
}
//判断栈满
int StackFull(SeqStack &S)
{
return S.top==n-1?true:false;
}
//进栈操作(将x放入栈中)
bool Push(SeqStack &S,Data x)
{
if(S.top==STACKSIZE-1)
return false;
else
{
S.top++;
S.data[S.top]=x;
return true;
}
}
//出栈操作
bool Pop(SeqStack &S,Data &x)
{
if(S.top==-1)
return false;
else
{
x=S.data[S.top];
S.top--;
return true;
}
}
//取栈顶元素,放入X中储存。
bool GetTop(SeqStack &S,Data &x)
{
if(S.top==-1)
{
return false;
}
else
{
x=S.data[S.top];
return true;
}
}
bool selectInStack(SeqStack &S,int num){ //查找是否在栈中
bool flag=false;
for(int i=0;i<=S.top;i++){
if(S.data[i].num==num){
flag=true;
}
}
return flag;
}
bool selectInQueue(CirQueue &S,int num)
{
bool flag=false;
// for(int i=S.front;i<=S.rear;i++){
// if(S.data[i].num==num){
// flag=true;
// }
// }(Q.rear+1)%MAXSIZE==Q.front
int a=S.front,b=S.rear;
while(a!=b){
if(S.data[a].num==num){
flag=true;
}
a=(a+1)%MAXSIZE;
}
return flag;
}
void moveStack(SeqStack &S,CirQueue &Q,int num,Data &b){
SeqStack carStandby; //备用栈,用来让汽车出去
InitStack(carStandby);
// Data S1;
int i,j,k;
for(i=0;i<=S.top;i++){
if(S.data[i].num==num){
b=S.data[i]; //存储出栈元素的数据
k=i; //存一下取出元素的位置
break;
}
}
Data S2;
for(j=S.top;j>k;j--){
Pop(S,S2);
Push(carStandby,S2);
}
Pop(S,S2);
for(i=k;!StackEmpty(carStandby);i++){
Pop(carStandby,S.data[i]);
S.top++;
}
// while(!StackEmpty(carStandby)){
// Pop(carStandby,S2);
// Push(carStandby,S2);
// }
if(Q.front!=Q.rear){ //若队列不空则队列的头子出队
DelQueue(Q,S2);
Push(S,S2);
}
}
int main()
{
int price,carNum,carTime;
bool flag=true;
char state;
SeqStack carParking;
CirQueue waitingSet; //停车队列
InitQueue(waitingSet);
InitStack(carParking);
printf("请输入停车场最大可容纳汽车,以及库存的汽车每小时的费用(小时/元)\n");
scanf("%d%d",&n,&price);
printf("请输入车的状态(A进/D出/E结束),车牌号和时间(进站时间/出站时间)\n");
while(flag){
getchar();
scanf("%c",&state);
getchar();
scanf("%d%d",&carNum,&carTime);
Data information;
information.num=carNum; information.time=carTime;
switch(state){
case 'A':{
if(StackFull(carParking)){ //若停车场栈满,则在外面排队
if(InQueue(waitingSet,information))
printf("车牌号为 %d 的车在便道的位置是%d\n",information.num,waitingSet.rear-waitingSet.front);
else printf("停车场外队列已满\n");
}else {
if(Push(carParking,information)){
printf("车牌号是 %d 的车在停车场的位置是 %d \n",information.num,carParking.top+1);
}
}
break;
}
case 'D':{ //出栈或者出队,判断元素是在栈中还是在队列中,若栈在,队列在,出栈则出队1进栈1,
if(selectInQueue(waitingSet,information.num)){
Data info;
DelQueue(waitingSet,info);
printf("在停车道候车等待的车 %d ,等得不耐烦回去了,并不收钱\n",info.num);
}else if(selectInStack(carParking,information.num)){
//取出元素,比并栈递推进入
int time,money,a;
Data b;
moveStack(carParking,waitingSet,information.num,b);
printf("车牌号是%d的车在停车场停留的时间是 %d 小时,共花费了 %d 元\n",b.num,information.time-b.time,(information.time-b.time)*price);
}else{
printf("无此车辆\n");
}
break;
}
case 'E':{
flag=false;
printf("输入结束...");
break;
}
default: printf("输入错误,请重新输入\n");break;
}
}
}
写的不是很好,多多见谅。