import java.util.*;
public class Solution {
//双栈加,hash表
//st1栈,栈顶是最近使用的,栈底是最久未使用的
//st2栈,用来中转数据
//hash表查询数据
HashMap<Integer , Integer> map = new HashMap<>() ;
Stack<Integer> st1 = new Stack<>() ;
Stack<Integer> st2 = new Stack<>() ;
int MaxSize = 0 ;
int size = 0 ;
public Solution(int capacity) {
this.MaxSize = capacity ;
}
public int get(int key) {
if(!map.containsKey(key)) return -1 ;
move(key) ;
return map.get(key) ;
}
public void set(int key, int value) {
if(map.containsKey(key)) {//已经有,替换,提前
map.put(key , value) ;
move(key) ;
} else {
if(this.size == this.MaxSize) {//置换,删除栈底的元素
int last = removeLast() ;
map.remove((Integer)last) ;
st1.push(key) ;
map.put(key , value) ;
} else {//存储,size++
map.put(key , value) ;
this.size ++ ;
st1.push(key) ;
}
}
}
//将key移动到栈顶
public void move(int key) {
while(!st1.isEmpty()) {
int cur = st1.pop() ;
if(cur != key) {
st2.push(cur) ;
}
}
while(!st2.isEmpty()) {
st1.push(st2.pop()) ;
}
st1.push(key) ;
}
//删除栈底,并返回栈底元素
public int removeLast() {
int res = 0 ;
int size = st1.size() ;
for(int i = 0 ; i < size ; i ++) {
if(i == size - 1) {
res = st1.pop() ;
} else {
st2.push(st1.pop()) ;
}
}
while(!st2.isEmpty()) {
st1.push(st2.pop()) ;
}
return res ;
}
}
/**
* Your Solution object will be instantiated and called as such:
* Solution solution = new Solution(capacity);
* int output = solution.get(key);
* solution.set(key,value);
*/