队列和栈的应用 ------ 停车场
来源:互联网 发布:部落冲突vb.67.9破解版 编辑:程序博客网 时间:2024/05/18 02:23
#include<stdio.h>#include<stdlib.h>#define STACKSIZE 3#define MAXSIZE 100int 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; } } }
写的不是很好,多多见谅。
0 0
- 队列和栈的应用 ------ 停车场
- 停车场管理(栈和队列的应用)
- 栈和队列的应用——停车场
- 停车场管理(栈和队列的应用)
- 停车场管理(栈和队列的应用)
- 停车场栈和队列的调用
- sdut oj2088 refresh 的停车场(栈和队列的混合应用)
- 数据结构课设--2停车场管理(栈和队列的应用)
- 栈和队列 实现停车场
- 停车场管理(栈与队列的应用)
- refresh的停车场(栈和队列的STL)
- 栈和队列的使用 refresh的停车场
- 用栈和队列实现简单的停车场管理系统
- SDUT -refresh的停车场(栈和队列)
- SDOTOJ2088 refresh的停车场(栈和队列)
- 用栈和队列实现的停车场管理系统
- 基于栈和队列的停车场管理系统
- [SDUT](2088)refresh的停车场 ---栈和队列
- jp.ne.so_net.ga2.no_ji.jcom.JComException: createInstance() failed HRESULT=0x800401F3L
- redis集合set操作
- secureCRT连接虚拟机与使用设置
- ListView或GridView上添加能一起滚动的Button效果的解决思路
- Java 8新特性探究(三):解开lambda最强作用的神秘面纱
- 队列和栈的应用 ------ 停车场
- java集合框架
- 【Netty源码分析】数据读取过程
- 更新npm和node版本
- spring 源码之二springmvc实现源码分析
- 简单测试连接mysql数据库
- 笔记同步到Github
- Java实现 RSA加密解密及数字签名
- Win7搭iis+asp+access的问题