苏嵌实训 日志4

姓名:刘姻
日前:9.6


今日学习任务

运用栈、队列、指针等至少完成“停车场”程序。


今日习题

main.c

#include "park.h"

int main()
{
   char choice[16] = {0};
   stack park_stack, leaving_stack;
   queue wait_queue;

   welcome();
   init(&park_stack,&leaving_stack,&wait_queue);//初始化栈和队列


   while (1)
   {
      menu();
      printf("选择功能: \n");
      memset(choice, 0, 8);
      scanf("%s",choice);

      switch(choice[0])
      {
         case '1':
             EnterPark(&park_stack, &wait_queue);
            break;
         case '2':
              OutPark(&park_stack,&leaving_stack,&wait_queue);
            break;
         case '3':
             ShowParkInfo(&park_stack);
            break;
         case '4':
             ShowWaitInfo(&wait_queue);
            break; 
         case '5':
            bye();
            break;
        }
   }
   return 0;
}          

queue.c

#include "park.h"

int InitQueue(queue *q)
{
   if (NULL == q)
   {
      return FAILURE;
   }
   node *p = (node *)malloc(sizeof(node));//分配头结点
   if (NULL == p)
   {
      return FAILURE;
   }
   p->next = NULL;

   //对头指针和队尾指针同时指向头结点
   q->front = q->rear = p;

   return SUCCESS;
}

int EnterQueue(queue *q,char *id)
{
   if (NULL == q || NULL == id)
   {
      return FAILURE;
   }

   node *p = (node *)malloc(sizeof(node));
   if (NULL == p)
   {
      return FAILURE;
   }
   strcpy(p->id,id);  //保存车牌号
   p->next = NULL;

   q->rear->next = p;
   q->rear = p;

   return SUCCESS;
}

int EmptyQueue(queue *q)
{
   if (NULL == q)
   {
      return FAILURE;
   }

   return (q->front == q->rear) ? SUCCESS : FAILURE;
}

char *DelQueue(queue *q)
{
   if (NULL == q)
   {
      return NULL;
   }

   char *id = (char *)malloc(32);
   if (NULL == id)
   {
      return NULL;
   }

   node *p = q->front->next;
   q->front->next = p->next;
   strcpy(id,p->id);
   free(p);

   if(p == q->rear)
   {
      q->rear = q->front;
   }

   return id;
}

park.c

#include <stdio.h>
#include "park.h"

void welcome()
{
   system("clear");  //清除屏幕
   printf("\n\n\n");
   printf("*******************\n");
   printf("********欢迎*******\n");
   printf("*******************\n");
   sleep(2);
}

void menu()
{
   system("clear");
   printf("\n\n\n");
   printf("\t\t 1、停车\n");
   printf("\t\t 2、出车\n");
   printf("\t\t 3、场内车辆信息\n");
   printf("\t\t 4、等候车辆信息\n");
   printf("\t\t 5、退出系统\n");
}

void bye()
{
   system("clear");
   printf("\t\t\t byebye!!\n");
   exit(1);    //退出程序
}

//初始化停车栈、让路栈、等候队列
void init(stack *s1,stack *s2,queue *q)
{
   int ret;

   ret = InitStack(s1);
   if (FAILURE == ret)
   {
     printf("Init Stack Failure!\n");
   } 

   ret = InitStack(s2);
   if (FAILURE == ret)
   {
     printf("Init Stack Failure!\n");
   }

   ret = InitQueue(q);
   if(FAILURE ==ret)
   {
      printf("Init Queue Failure!\n");
   }
}
void EnterPark(stack *s,queue *q)
{
   char id[32] = {0};  //保存车牌号
   int ret;

   printf("输入车牌号; \n");
   scanf("%s",id);

   ret = push(s,id);
   if(ret == FAILURE)
   {
      printf("push failure!\n");
   }
   else if(ret == FULL)//栈满
  {
      printf("停车场满,进入等候区。\n");
      sleep(2);
      EnterQueue(q,id);
  }
}

void ShowParkInfo(stack *s)
{
   if (NULL == s)
   {
      return;
   }
   if (s->top == -1)
   {
      printf("没有车辆!\n");
      sleep(2);
      return;
   }

   int i;
   for (i = 0;i<= s->top;i++)
   {
      printf("车牌号:%s\n",s->CarData[i].id);
      printf("停车时长:%d\n",(int)(time(NULL) - s->CarData[i].t));
      printf("***********\n");

   }  
      printf("Press Enter Continue..\n");
      getchar();
      getchar();
}

void ShowWaitInfo(queue *q)
{
   if (NULL == q)
   {
      return;
   }
   node *p=q->front->next;
   while(p)   //while (p != NULL)
   {
     printf("车牌号:%s\n",p->id);
     p = p->next;
   }
   getchar();
   getchar();
}

void OutPark(stack *s1,stack *s2,queue *q)
{
   char *str;
   char id[32] = {0};
   int i=0;
   if (NULL == s1||NULL==s2||NULL==q)
   {
      return;
   }

   printf("输入车牌号:\n");
   scanf("%s",id);

   while(1)
   {
      if(!strcmp(s1->CarData[s1->top].id,id))//车牌号相同
      {
         str = pop(s1);  //车辆出栈
         free(str);
         while(EmptyStack(s2)!=SUCCESS)  //让路栈不为空
         {
            str=pop(s2);
            push(s1,str);
            free(str);
         }

         if (EmptyQueue(q)!=SUCCESS)
         {
            str = DelQueue(q);
            push(s1,str);
            free(str);
         }
         break;
      }
      else
      {
         str=pop(s1);
         push(s2,str);
         free(str);
      }

      if(EmptyStack(s1)==SUCCESS)
     {
         printf("车辆不存在!\n");
         sleep(2);
         while (EmptyStack(s2)!=SUCCESS)//所有车辆回到停车栈
         {
            str = pop(s2);
            push(s1,str);
            free(str);
         }
         break;
     }
  }
}    

park.h

#ifndef PARK_H
#define PARK_H

#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAXSIZE   5
#define SUCCESS  1000
#define FAILURE  1001
#define FULL     1002

struct CarInfo  //保存车辆信息
{
   char id[32];    //车牌号
   time_t t;   //停车时间
};
typedef struct CarInfo info;

struct Stack  //停车/让路线
{
   info CarData[MAXSIZE];
   int top;
};
typedef struct Stack stack;

struct Node   //表示等候队列结点信息
{
   char id[32];
   struct Node *next;
};
typedef struct Node node;

struct Queue   //等候你队列
{
   node *front; //队头指针
   node *rear;  //队尾指针
};
typedef struct  Queue queue;

void welcome();
void menu();
int InitQueue(queue *q);
int InitStack(stack *s);
void init(stack *s1,stack *s2,queue *q);
int EnterQueue(queue *q,char *id);
int push(stack *s,char *id);
void EnterPark(stack *s,queue *q);
void ShowParkInfo(stack *s);
void ShowWaitInfo(queue *q);
int EmptyStack(stack *s);
char *pop(stack *s);
int EmptyQueue(queue *q);
char *DelQueue(queue *q);
#endif

stack.c

#include "park.h"

int InitStack(stack *s)
{
   if (NULL == s)
   {
      return FAILURE;
   }

  s->top = -1;  //初始化成空栈

  return SUCCESS; 
}

int push(stack *s,char *id)
{
  if (NULL == s || NULL == id)
  {
     return FAILURE;
  } //入参判断

  if (s->top == MAXSIZE - 1)//满
  {
     return FULL;
  }

  strcpy(s->CarData[s->top + 1].id,id);
  s->CarData[s->top + 1].t = time(NULL);

  s->top++;

  return SUCCESS;
}

char *pop(stack *s)
{
   char *id = (char *)malloc(32);
   if(NULL == id)
   {
      return NULL;
   }
   if(NULL == s)
   {
      return NULL;
   }
   if (s->top == -1)
   {
      return NULL;
   }

   strcpy(id,s->CarData[s->top].id);
   s->top--;

   return id;

}
int EmptyStack(stack *s)
{
   if (NULL == s)
   {
      return FAILURE;
   }

   return (s->top == - return (s->top == -1)?SUCCESS:FAILURE;
}

今日开发中出现的问题汇总
程序复杂,理解困难


今日开发收获
打代码速度有所提高,错误率明显降低。


自我评价
独立编写程序技能和程序理解能力有待提高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值