#include<stdio.h>
#include<stdlib.h>
#define stack_initsize 20
#define pay 10 // 停车场每小时的停车费用
typedef struct list{
char car_ch;//选择进入或者离开
int car_num;//车牌号
int car_time;//时间结点
struct list *next;//表示车的位置
}*Car,list;
typedef struct stack{
int elem_num;
struct list stack_elem[stack_initsize];
}S;
//队列
typedef struct node{
Car rear;//队尾
Car front;//队首
}LinkQueueNode;
//储存车辆数目
typedef struct car_numbercheck{
int *car_numstore;
int elemnum;
}*check_num;
//输入数据
int searchBusNo(check_num car_check,int car_num);
int searchBusNo(check_num car_check,Car q)
{
int flag = 1;
int i = 0;
if(car_check->elemnum == 0){
car_check->car_numstore[car_check->elemnum++] = q->car_num;//第一辆车
}
else{
for(i = 0;i <= car_check->elemnum; i++){
if(car_check->car_numstore[i] == q->car_num){
flag = -1;//标志找到车牌
break;
}
}
}
if(flag == 1){
if(q->car_ch == 'A'){
car_check->car_numstore[car_check->elemnum++] = q->car_num;
}
return car_check->car_numstore[i];
}
else{//重复标志
//将车牌放在俩面
return flag;
}
}
void add(Car q,check_num car_check){
//时间正确性检验
printf("请输入目前时间:");
scanf("%d",&q->car_time);//注意时间用的是浮点数表示
//车牌正确性检验
printf("请输入车辆车牌号:");
scanf("%d",&q->car_num);
if(searchBusNo(car_check,q)==-1 && q->car_ch == 'A'){
printf("车牌号重复!\n");
printf("请重新输入车牌信息:");
scanf("%d",&q->car_num);
}
}
//入栈,进入停车场空位
void in_stack(S *s,Car q){
s->stack_elem[s->elem_num++] = *q;
}
void display_stack(S *Q){
printf("已停靠车辆:\n");
//int temp = (s->top)+1;
printf(" 车牌号 到达时间\n");
for(int i = 0; i <= Q->elem_num-1;i++){
printf(" %4d%14d\n",Q->stack_elem[i].car_num,Q->stack_elem[i].car_time);
}
}
void display_quene(struct node *Q){
Car temp = Q->front;
printf("等待车辆:\n");
printf(" 车牌号 到达时间\n");
if(Q->front == Q->rear){
printf("********************\n");
}
else{
while(temp!=NULL){
printf(" %4d%14d\n",temp->car_num,temp->car_time);
temp = temp->next;
}
}
putchar('\n');
}
//菜单操作
void in_quene(LinkQueueNode *Q , Car q){
Q->rear->next = q;
q->next = NULL;
Q->rear = q;
}
//判断是否有车进去
Car position(struct stack *P,Car q){
int temp = P->elem_num - 1;
while(temp>=0){
if(P->stack_elem[temp].car_num== q->car_num){
return &(P->stack_elem[temp]);
break;
}
temp--;
}
}
//展示离去停车的车辆
void display_depart(Car p,Car q,int money){
printf("#############################\n");
printf("离去车辆信息:\n");
printf("车牌号:%d\n",p->car_num);
printf("车辆到达时间:%d\n",p->car_time);
printf("车辆离开时间: %d\n",q->car_time);
printf("停车费用:%d\n",money);
printf("#############################\n");
}
void leave_stack(Car q,check_num car_check,S *P,struct node *Q ){
if(searchBusNo(car_check,q) != -1){
printf("车牌号不存在!!!\n");
printf("请重新输入!!!");
printf("车牌号是:");
scanf("%d",&q->car_num);
}
Car p = position(P,q);//找到位置
if(p->car_time >= q->car_time){
printf("离开时间小于到达时间,请重新输入到达时间:");
scanf("%d",&q->car_time);
}
int money = pay * (q->car_time - p->car_time);//停车费用
//开始模拟停车过程
display_depart(p,q,money);
//创建临时栈储存出车元素
S *temp = (S *)malloc(sizeof(S)*stack_initsize);
temp->elem_num = 0;//初始化
if(P->stack_elem[P->elem_num - 1].car_num == p->car_num){
P->elem_num --;//退栈
}
else{
P->elem_num --;
while(P->stack_elem[P->elem_num].car_num != p->car_num){
in_stack(temp,&(P->stack_elem[P->elem_num]));
P->elem_num--;//进入临时栈
}
while(temp->elem_num > 0){
--temp->elem_num;
in_stack(P,&temp->stack_elem[temp->elem_num]);
}
}
// //队列元素进栈
// //队中存在元素
if(Q->front != Q->rear){
in_stack(P,Q->front);//队首进栈
Car K = Q->front;
Q->front = Q->front->next;
free(K);
}
}
char menu(Car q)
{
char n;
printf("\n ************* 停车场管理系统 **************\n");
printf(" *%15c1---停车(A)%19c\n",' ','*');
printf(" *%15c2---离开(D)%19c\n",' ','*');
printf(" *%15c3---结束程序(E)%15c\n",' ','*');
printf(" *******************************************\n");
printf("菜单选择:A,D,E: ");
do{
printf("请输入操作:");
n = getchar();
q->car_ch = n;
}while(n!='A'&&n!='D'&&n!='E');
printf("\n");
return n;
}
//入队操作
int main(void){
Car q,p_quene;
p_quene = (Car)malloc(sizeof(list));
int i = 1;
int n;//停车场位置
int flag = 1;//标记
printf("请输入停车场的位置个数:");
scanf("%d",&n);
printf("本程序中设定停车场的停车费为10元每小时\n");
struct stack *P = (S*)malloc(sizeof(S));//栈
P->elem_num = 0;
struct node *Q = (struct node *)malloc(sizeof(struct node));//队
Q->front = Q->rear;
check_num car_check;
car_check = (check_num)malloc(sizeof(struct car_numbercheck)); //检验指针
car_check->car_numstore = (int *)malloc(sizeof(int)*10);
car_check->elemnum = 0;//初始化车辆数目
int end = 1;
while(end)
{
getchar();
printf("请输入第%d次车辆信息:\n",i++);
Car q = (Car)malloc(sizeof(list));
menu(q);
add(q,car_check);
switch(q->car_ch){
case 'A':{
if(flag <= n){
//车库有剩余的车位
in_stack(P,q);//入栈操作
}
//入队
else{
in_quene(Q,q);//入队
}
flag++;
break;
}
case 'D':{
display_stack(P);
display_quene(Q);
leave_stack(q,car_check,P,Q );
flag--;
display_stack(P);
display_quene(Q);
break;
}
case 'E':
{
end = 0;
break;
}
}
}
display_stack(P);
display_quene(Q);
return 0;
}
以上是本人(广东某大学大二计算机专业)的数据结构作业。在这次的代码中,不仅综合运用了栈,队列的定义,即为栈和队列的出栈和入栈,还涉及了栈储存的元素如何与队列储存的元素之间相互转换的算法,并且,在实际操作的过程中,还会遇到怎么确定目标元素是否存在(车牌号是否存在)的算法难题(对我而言),还有确定车辆位置的算法。所以我记录一下这次的作业不仅仅是为了自己对线性结构的操作更加熟练,野衷心希望能帮助到大家。如有是什么建议都可留言。多谢各位大佬!!!