#include <iostream>
using namespace std;
const int carnumber = 3; //栈容量
const int dayprice = 10; //每日停车费
struct Car
{
string license; // 汽车牌照
int pushtime; // 进栈时间
int poptime; //出栈时间
string state; // 状态
};
typedef struct //栈
{
struct Car cars[carnumber];
int top;
} Sqstack;
typedef struct qnode //链队列结点
{
Car car;
struct qnode* next;
}qnode, * quene;
typedef struct //链队列
{
quene front, rear;
}LinkQuene;
bool isEmpty(Sqstack* stack)
{
return stack->top == -1;
}
bool initquene(LinkQuene* Q)
{
Q->front = Q->rear = new qnode;
Q->front->next = NULL;
return true;
}
bool EnQuene(LinkQuene* Q, Car newcar) //进入队列
{
quene p = new qnode;
p->car = newcar;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
cout << "进入队列车的车牌号和时间" << endl;
cout << newcar.license << endl;
cout << newcar.pushtime << endl << endl;
return true;
}
bool DeQuene(LinkQuene* Q, Car& newcar) //离开队列
{
if (Q->front == Q->rear) // 队列为空
{
return false;
}
quene p;
p = Q->front->next;
newcar = p->car;
Q->front->next = p->next;
delete p;
return true;
}
bool initstack(Sqstack* stack)
{
stack->top = -1;
return true;
}
bool visitstack(Sqstack* stack)
{
cout << "遍历现有栈" << endl;
for (int i = 0; i <= stack->top; i++)
{
cout << stack->cars[i].license<<endl;
}
return true;
}
void pushstack(Sqstack* stack, LinkQuene* Q, struct Car newCar)
{
if (stack->top < carnumber - 1)
{
// 检查车辆是否已经在栈中
for (int i = 0; i <= stack->top; i++)
{
if (stack->cars[i].license == newCar.license)
{
cout << "该车辆已经在栈中。" << endl;
return;
}
}
int i = stack->top;
if (i >= 0 && stack->cars[i].pushtime > newCar.pushtime) //栈顶车进栈时间和要新进车的进栈时间相比
{
cout << "时间错误" << endl;
return;
}
stack->top++;
stack->cars[stack->top] = newCar;
cout << "车进栈.";
cout << "汽车牌照:" << newCar.license << endl;
cout << "进栈时间:" << newCar.pushtime << endl;
cout << "排在第 " << stack->top + 1 << " 位" << endl;
cout << endl;
}
else
{
cout << "栈已满,无法入栈,准备进入队列" << endl;
EnQuene(Q, newCar);
}
}
void popstack(Sqstack* stack, LinkQuene* Q, struct Car *newCar) //只能出栈尾元素,不能想出哪个出哪个
{
if (stack->top >= 0)
{
*newCar = stack->cars[stack->top];
stack->top--;
cout << "出栈一个车" << (*newCar).license << endl;
cout << "stack.top = "<<stack->top<<endl;
}
else
{
cout << "栈是空的,无法弹出车辆。" << endl;
}
}
bool enterinformation(Car* car)
{
cout << "输入汽车状态(到达或离开): ";
cin >> car->state;
cout << "输入汽车牌照: ";
cin >> car->license;
if (car->state == "到达")
{
cout << "输入汽车到达时间: ";
cin >> car->pushtime;
}
else if (car->state == "离开")
{
cout << "输入汽车离开时间: ";
cin >> car->poptime;
cout << endl;
}
return true;
}
bool operate(Sqstack* stack, Sqstack* supstack, LinkQuene* Q, Car* car)
{
enterinformation(car);
if (car->license.empty()) // || car->pushtime < 0
{
cout << "输入错误" << endl;
return false;
}
if (car->state == "到达")
{
pushstack(stack, Q, *car);
}
else if (car->state == "离开")
{
bool found = false;
int time = car->poptime - car->pushtime + 1;
int price = time * dayprice;
int i = 0;
for (; i <= stack->top; i++)
{
if (stack->cars[i].license == car->license && stack->cars[i].pushtime < car->poptime)
{
found = true;
// 将目标车辆和其他车辆全部退出栈,并将其他车辆进入辅助栈
for (int j = stack->top; j >= i; j--)
{
Car tempCar;
popstack(stack, Q, &tempCar);
if (j > i)
{
cout << "存入辅助栈" << endl;
pushstack(supstack, Q, tempCar); // 辅助栈暂存其他车辆
}
else
cout << "离开的车辆牌照:" << tempCar.license << endl; // 输出离开的目标车辆信息
}
cout << "离开的时间:" << car->poptime << endl;
cout << "需付费:" << price << endl<<endl;
// 将辅助栈中的车辆重新进入原停车场栈
while (!isEmpty(supstack))
{
Car tempCar;
cout << "辅助栈车准备出辅助栈" << endl;
popstack(supstack, Q, &tempCar);
cout << "辅助栈车准备进栈" << endl;
pushstack(stack, Q, tempCar);
}
break;
}
}
if (found == false)
{
cout << "找不到"<<endl;
return false;
}
if (Q->front != Q->rear) //检查队列是否为空
{
Car queueCar = Q->front->next->car; // 获取队首车辆
DeQuene(Q, queueCar); // 从队列中删除队首车辆
cout << "队列首位车准备进栈" << endl;
pushstack(stack, Q, queueCar); // 将队首车辆放入停车场
}
else
{
cout << "队列为空" << endl;
}
//cout << stack->cars[i].license<<endl;
}
else
{
cout << "输入错误" << endl;
return false;
}
return true;
}
int main()
{
Sqstack stack;
Sqstack supstack;
LinkQuene quene;
Car car1, car2, car3, car4, car5, car6, car7, car8, car9, car10;
Car cars[] = { car1, car2, car3, car4, car5 };
initstack(&stack); // stack->top = -1
initstack(&supstack);
initquene(&quene);
int numCars = sizeof(cars) / sizeof(cars[0]);
for (int i = 0; i < numCars; i++)
{
operate(&stack, &supstack, &quene, &cars[i]);
}
visitstack(&stack);
return 0;
}
我输入的是
到达 1 1 d达 2 2 dd 3 3 到d 4 4 离开 2 5 (提问禁止重复输入同样的词汇或符号,很无奈)
输出的付费结果是68,但理应为4 * 10 = 40