java解决排队找零问题
时间: 2023-08-18 16:10:01 浏览: 39
排队找零问题通常可以使用模拟的方法来解决。具体来说,我们可以使用一个计数器来统计当前队列中需要找零的总金额,以及一个变量来记录当前收银员手头上的现金总额。对于每个顾客,我们需要先判断是否可以找零,如果可以,就把找零的金额加到收银员手头上的现金总额中,并且把队列中的顾客弹出。最后,如果队列为空,则找零结束,否则就继续处理下一个顾客。
具体实现如下(假设顾客的信息已经被封装成了一个Customer类):
```java
import java.util.LinkedList;
import java.util.Queue;
public class Cashier {
private int cash; // 收银员手头上的现金总额
private int total; // 需要找零的总金额
private Queue<Customer> queue; // 顾客队列
public Cashier(int cash) {
this.cash = cash;
this.total = 0;
this.queue = new LinkedList<>();
}
// 添加一个顾客到队列中
public void addCustomer(Customer c) {
queue.offer(c);
total += c.getPrice() - c.getMoney();
}
// 处理队列中的顾客,直到队列为空
public void process() {
while (!queue.isEmpty()) {
Customer c = queue.peek();
if (cash >= c.getPrice() - c.getMoney()) {
cash += c.getMoney();
cash -= c.getPrice() - c.getMoney();
queue.poll();
} else {
break;
}
}
}
// 判断是否还有顾客需要找零
public boolean hasRemaining() {
return !queue.isEmpty();
}
// 获取需要找零的总金额
public int getTotal() {
return total;
}
// 获取收银员手头上的现金总额
public int getCash() {
return cash;
}
}
```
使用示例:
```java
Cashier cashier = new Cashier(100); // 创建一个初始现金为100的收银员
cashier.addCustomer(new Customer(50, 70)); // 添加一个需要找零20元的顾客
cashier.addCustomer(new Customer(60, 80)); // 添加一个需要找零20元的顾客
cashier.process(); // 处理顾客,此时收银员手头上的现金总额为10
System.out.println(cashier.getTotal()); // 输出剩余需要找零的总金额,为0
System.out.println(cashier.getCash()); // 输出收银员手头上的现金总额,为10
```
需要注意的是,排队找零问题的解决方法并不唯一,可能会因为具体情况的不同而有所不同。