算法-队列结构
一、队列
队列是一种特殊的线性表,只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
- 先进先出
二、用栈实现队列
class MyQueue {
Stack<Integer> stack1;
Stack<Integer> stack2;
/** Initialize your data structure here. */
public MyQueue() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
/** Push element x to the back of queue. */
public void push(int x) {
stack1.push(x);
}
/** Removes the element from in front of queue and returns that element. */
public int pop() {
if(empty()) {
return -1;
}
if (stack2.isEmpty()) {
while(!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
/** Get the front element. */
public int peek() {
if(empty()) {
return -1;
}
if (stack2.isEmpty()) {
while(!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
return stack2.peek();
}
/** Returns whether the queue is empty. */
public boolean empty() {
return stack1.isEmpty() && stack2.isEmpty();
}
}
三、推荐结果打散
import java.util.List;
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
public class KuaiShouEx2 {
public static void main(String[] args) {
List<String> picAndVideoList = new ArrayList<>();
picAndVideoList.add("v_0");
picAndVideoList.add("v_1");
picAndVideoList.add("v_2");
picAndVideoList.add("p_3");
picAndVideoList.add("p_4");
picAndVideoList.add("p_5");
picAndVideoList.add("v_6");
picAndVideoList.add("p_7");
picAndVideoList.add("v_8");
picAndVideoList.add("v_9");
List<String> result = new KuaiShouEx2().getRecommendenResult(picAndVideoList, 4);
for (int i = 0; i < result.size(); i++) {
System.out.println(result.get(i));
}
}
public List<String> getRecommendenResult(List<String> picAndVideo, int maxInterval) {
List<String> result = new ArrayList<>();
if (picAndVideo == null || picAndVideo.size() == 0) {
return result;
}
//LinkedList 就是一个Queue
Queue<String> videoQueue = new LinkedList<>();
Queue<String> picQueue = new LinkedList<>();
boolean firstPic = false;
int index = 0;
int picAndVideoSize = picAndVideo.size();
//取出firstPic 之前的所有Video
while (!firstPic && index < picAndVideoSize) {
if (isVideo(picAndVideo.get(index))) {
result.add(index, picAndVideo.get(index));
index++;
} else {
firstPic = true;
}
}
//videoQueue picQueue 赋值
while (index < picAndVideoSize) {
if (isVideo(picAndVideo.get(index))) {
videoQueue.add(picAndVideo.get(index));
} else {
picQueue.add(picAndVideo.get(index));
}
index++;
}
int currentSize = result.size();
//推荐结果打散
while(!videoQueue.isEmpty() && !picQueue.isEmpty()) {
if (currentSize >= maxInterval) {
result.add(picQueue.poll());
currentSize = 0;
} else {
result.add(videoQueue.poll());
currentSize++;
}
}
while(!videoQueue.isEmpty()) {
result.add(videoQueue.poll());
}
//最后一次pic,如果没有大于间隔,则丢弃pic
if(currentSize >= maxInterval && !picQueue.isEmpty()) {
result.add(picQueue.poll());
}
return result;
}
public boolean isVideo(String clip) {
if(clip.indexOf("v") != -1) {
return true;
}
return false;
}
}