-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcloudera.cpp
More file actions
83 lines (57 loc) · 2.2 KB
/
cloudera.cpp
File metadata and controls
83 lines (57 loc) · 2.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
A vending machine serves three options: "Snack", "Drink" or "Surprise Me".
The machine dispenses the oldest item first (e.g. worker refills machine each day,
one at a time, and the machine serves items first in, first out).
Implement data structure to maintain inventory: implement enqueue(), dequeueAny(), dequeueDrink(),
and dequeueSnack().
*/
#include <queue>
#include <iostream>
#include <utility>
using namespace std;
#define SNACK 1
#define DRINK 2
class Item {
int type;
};
typedef pair<int, Item> STOCK;
class pop_machine {
private:
queue<STOCK> snackQueue;
queue<STOCK> drinkQueue;
int itemId;
public:
pop_machine(): itemId(0) { };
~pop_machine() { } ;
void enqueue(Item item) {
(i.type == SNACK) ? snackQueue.push(make_pair(itemId++,item)) : drinkQueue.push(make_pair(itemId++,item));
};
Item dequeueSnack(){
if (isSnackEmpty()) {
//throw exception here
return NullItem;
}
STOCK ret = snackQueue.front();
snackQueue.pop();
return ret.second;
};
Item dequeueDrink(){
if (isDrinkEmpty()) {
//throw exception here
return NullItem;
}
STOCK ret = drinkQueue.front();
drinkQueue.pop();
return ret.second;
};
Item dequeueAny() {
if (drinkQueue.empty() && snackQueue.empty()) return NullItemm;
if (drinkQueue.empty()) return dequeSnack();
//Else both queues have items in them
const STOCK & drink = drinkQueue.front();
const STOCK & snack = snackQueue.front();
return (snack.first < drink.first) ? dequeSnack() : dequeueDrink();
};
bool isSnackEmpty() const { return snackQueue.empty(); }
bool isDrinkEmpty() const { return drinkQueue.empty(); }
}