循环数组队列(模拟北饭三的旋转火窝)
package six;
/**1.循环数组(模拟北饭三的旋转火窝)设置缓冲区的大小是4,即数组length=4,为了让每一种情况出现的可能性大点。为了构建逻辑循环数组,下标取模。在数组中有一个head和tail标记,分别模拟旋转火窝的吃货和端菜的服务员,刚开始因为没食物,还不能开始吃。建一个随机数,大于等于0.5的话服务员就端上菜,小于0.5吃货吃菜。上菜和开吃都要有个判断,判断这个缓冲区是否满了或者空了,比如头追上尾时表示空,尾追上头时表示满了。这里模拟端菜+吃菜的总次数=50次。(端菜和吃菜两个不同的操作,建议用两个线程来做,随机数的大小来控制每个线程的挂起和进行),输出要求:输出每一步服务员端了什么菜,吃货吃了什么菜,缓冲区里面还有什么菜。若满,服务员输出“菜桌已满,无法继续端菜” ,空时,吃货输出 “没菜了,服务员上菜”**/
public class Main2
{public static void main(String[] args){String[] a=new String[4]; //创建菜谱RotateArray<String> ra=new RotateArray<String>(a);String[] menu=ra.menu();costomer<String> c=new costomer<String>(ra);waiter<String> w =new waiter<String>(ra, menu);Thread t1=new Thread(c);Thread t2=new Thread(w);t2.start();t1.start();}
}
class RotateArray<T>
{public T[] tarray; //缓冲区public int head;public int tail;public RotateArray(T[] t){this.tarray = t;}//进栈public synchronized boolean enqueue(T t){// notifyAll();if((tail+1)%tarray.length!=head){tarray[tail%tarray.length]=t;tail=(tail+1)%tarray.length;System.out.println("服务员上菜"+t+" 桌子有的菜: "+this.stay());return true;}elseSystem.out.println("菜桌已满,无法继续端菜"+" 桌子有的菜: "+this.stay());
// try
// {// wait();
// } catch (InterruptedException e)
// {// System.out.println("costomer error");
// }return false;}public synchronized T outqueue(){// notifyAll();T t=null;if(tail!=head){t=tarray[head%tarray.length];head=(head+1)%tarray.length;System.out.println("吃货者吃菜:"+t+" 桌子有的菜: "+stay());}elseSystem.out.println("没菜了,服务员上菜"+" 桌子有的菜: "+stay());
// try
// {// wait();
// } catch (InterruptedException e)
// {// System.out.println("costomer error");
// }return t;}//创建菜单public String[] menu(){String[] a=new String[5];a[0]="1";a[1]="2";a[2]="3";a[3]="4";a[4]="5";return a;}//查看桌子上的菜public String stay(){String str="";for(int x=head;x!=(tail%tarray.length);){str=str+tarray[x%tarray.length]+" ";x=(x+1)%tarray.length;}return str;}
}
class waiter<T> implements Runnable
{public T[] menu;RotateArray<T> ra;public waiter(RotateArray<T> ra,T[] menu){this.menu=menu;this.ra=ra;}@Overridepublic void run(){for(int x=0;x<50;x++){ra.enqueue(menu[(int)(Math.random()*menu.length)]); double myrandom=Math.random();if(myrandom>=0.6){ try{Thread.currentThread().sleep(100);} catch (InterruptedException e){// TODO Auto-generated catch blocke.printStackTrace();}}}}
}
class costomer<T> implements Runnable
{RotateArray<T> ra;public costomer(RotateArray<T> ra){this.ra=ra;}@Overridepublic void run(){for(int x=0;x<50;x++){ra.outqueue();double myrandom=Math.random();if(myrandom>=0.6){ try{Thread.currentThread().sleep(100);} catch (InterruptedException e){// TODO Auto-generated catch blocke.printStackTrace();}}}}
}
循环数组队列(模拟北饭三的旋转火窝)相关推荐
- 13004.循环数组队列(C语言)
1 循环数组队列 1.1 队列定义 /** loop_queue.h** Created on: Mar 2, 2022* Author: xhome.*/#ifndef OTHER_TASK_LOO ...
- js 利用数组队列模拟多线程操作
不知道下面的想法对不对,如有错误还请大佬斧正 需求分析 有一批设备,数量很多,需要为他们开启远程驱动(即调用后台的远程驱动接口),问题是后台处理远程驱动只能一台一台设备处理,如果设备数量很多,后台ph ...
- 【C++算法与数据结构学习笔记------用循环数组实现队列】
照王晓东<数据结构>(C++语言版)上打的,以备留用. 1 #include <iostream> 2 using namespace std; 3 template<t ...
- 【学校实验】停车场问题:设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
停车场问题 问题描述 测试数据 基本要求 实现提示 代码实现 栈的实现 队列的实现 主函数的实现 问题描述 设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出.汽车在停车场内按车辆 ...
- 「Java数据结构」手撕数组队列及环形数组队列。
目录 一.队列 1.基本介绍 2.示意图 3.队列的特点 二.数组模拟队列 1.数组队列初始化 2.判断方法 3.增删改查的方法 4.注意 三.数组模拟环形队列 1.初始化 2.判断方法 3.增删改查 ...
- 1276 士兵队列训练问题【队列模拟】
士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 营业窗口队列模拟-2
数据结构课程设计 海纳百川,大道致远 时光荏苒,青春在这里生长,为了理想我们在这里摩拳擦掌, 岁月不居,梦想依旧灿烂,纯真的理想在这里放飞 这个设计是为了让我们在队列的理解上更加的明白,然后自己做了一 ...
- 【HDU 1276】士兵队列训练问题(两个队列模拟)
题目链接 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1276 解题思路 两个队列模拟即可,注意: 必须每一轮都点完,而不是数到只剩三人了就停止. 如 ...
- 约瑟夫问题的学习(基于循环链表)以及基于循环数组
这是17世纪法国数学家加斯帕在<数目中的游戏问题>讲的一个问题:15个教徒和15个非教徒在海上遇险,必须将一般的人投入海中,其他的人才能幸免于难.与实现各一个办法:30个人围成一个圈,从第 ...
最新文章
- 人脸对齐--Dense Face Alignment
- centos7 php配置,CentOS7 下nginx与PHP的安装与配置
- SAP RETAIL WR60 商品补货参数概述
- 《孙子兵法》十三篇注译(15--结束语)
- jQuery在线手册
- CodeForces - 1355E Restorer Distance(三分)
- 测试用例设计方法 - 场景分析法
- Python 的构建工具 setup.py
- flask 加载配置文件
- TotalFinder for Mac(Finder增强工具)
- android:textStyle 设置加粗并倾斜
- 把每列中最大的数据合并一行
- c++如何让类对象只能在堆(栈)上分配空间
- 24位真彩色bmp图片转8位256色带调色板的bmp图
- 【离散数学】陪集的详解
- Metricbeat监控Docker进程
- 限时免费!Python自学资料包免费领,再不收藏就晚了
- macbookair有没有touchbar_Touch Bar 真的好用吗?苹果全新 MacBook Pro 触控条上手体验...
- 计算某一天是一年中的第几天
- 每日统计部门人员考勤打卡情况并汇总通知