栈和队列实验报告数据结构实验报告实验二栈和队列实验班级:计12-2姓名:,掌握栈和队列基本运算的实现过程。重点掌握栈和队列各种操作的实现。,且只有一个大门可供汽车进出,汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列,若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入,当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用,试为停车场编制按上述要求进行管理的模拟程序。,因为停车场内部是先进入的车辆放到最北面,之后进来的车辆依次排到南面,如果有车辆要出去,那么在它之后进入的车辆必须先退出,给这个车辆让路,这个车辆出去之后再返回到停车场,这就是栈的先进后出的操作一致,因此选择栈存储停车场内的车辆,而便道上的车辆则不同,便道上的车辆,进来之后就排在最西边,如果有车辆要出去,那么在它之前车辆必须依次排到队尾,之后这个车辆开出便道,这和队列的先进先出操作一致,因此用队列存储便道上的车辆。 : structPark { intstatus;//车的状态,0表示进入,1表示离开 intnum;//车的牌号 inttime;//车离开或者进入的时间};//车的基本信息的结构体定义 typedefstruct { structPark*base;//栈底指针 structPark*top;//栈顶指针 intstacksize; }SqStack;栈数据结构定义队列数据结构类型定义 typedefstructQNode { structParkdata;//数据域 structQNode*next; }QNode,*Queueptr; typedefstruct { Queueptrfront;//队头指针 Queueptrrear;//队尾指针}LinkQueue; voidInitStack(SqStack&S); //初始化一个栈 voidPush(SqStack&S,structParke); //压入一个栈顶元素 structParkGetTop(SqStack&S); //得到栈顶元素,函数的返回值为存放车的信息的结构体变量 structParkPop(SqStack&S); //删除栈顶元素,且函数的返回值为栈顶元素 intEmptyStack(SqStackS); //判断一个栈是否为空,空返回1,非空返回0 voidVisitStack(SqStackS); //遍历一个栈而且输出栈元素的信息,输出顺序为从栈底元素到栈顶元素voidInitQueue(LinkQueue&Q); //初始化一个队列 voidInsertQueue(LinkQueue&Q,structParke); //在队列的队尾处中插入一个元素 voidDeleteQueue(LinkQueue&Q); //删除队头元素 voidVisitQueue(LinkQueueQ); //遍历队列,且输出队列元素信息,按照从队头到队尾的顺序输出voidDQueue(LinkQueue&Q,structParke); //在队列中删除元素信息的数据域中的num值和e的num相等的元素intDStack(SqStack&S,structParkp,double&d); //在栈中查找是否有与p的num值相等的元素,如果找到,改变d的值,函数值返回1,否则函数值返回0 ,判断是否是输入结束标志,是则跳出循环,否则判断是否是进入的车辆,如果是进入的车辆,那么判断此时栈是否已经满了,如果此时栈已满,那么该车辆就要入队列,否则入栈。如果该车辆是出去的,那么先判断该车辆是否是在栈中,如果是在栈中,那么直接在栈中删除即可,删除完之后还要检查此时队列是否为空,如果队列非空,那么队列的队头元素出队列压入栈中。如果不在栈中,那么将该元素直接在队列中删除即可。之后循环出来之后输出要输出的三个信息。下面为该过程的流程图描述: : intmain() { doubleprice; structParkp; inta[100],i=0,j; doubleb[100]; scanf("%d%lf",&Length,&price); SqStackS; InitStack(S);//初始化一个栈 LinkQueueQ; InitQueue(Q);//初始化一个
栈和队列实验报告 来自淘豆网m.daumloan.com转载请标明出处.