適合使用佇列(Queue)來解答的LeetCode題目,並利用這些題目來熟悉佇列的操作的題目好少,但還努力找了兩篇!
佇列(Queue)是一種常見的資料結構,用於儲存和管理元素,與Stack不同的是,其遵循先進先出(FIFO,First-In-First-Out)的原則。也就是說:
佇列在許多應用中都有重要作用,包括操作系統中的進程排程、計算機網絡中的數據包處理、圖算法中的廣度優先搜索等等。這種資料結構可協助保持處理順序的一致性,確保按照添加的順序進行處理。
值得注意的是,實際上佇列可以使用不同的資料結構實現,包括陣列、鏈表或其他數據結構,具體的實現方式取決於應用的需求和性能要求。
以下是一些常見的佇列操作:
下面是一個使用C++演示如何使用array實現佇列的基本操作:
# include<iostream>
using namespace std;
class Queue{
private:
int size;
int front;
int rear;
int *Q;
public:
Queue(int size){
}
bool isFull();
bool isEmpty();
void add(int x);
int remove();
int Front();
void display();
};
bool Queue::isFull(){
if(rear == size-1)
return true;
return false;
}
bool Queue::isEmpty(){
if(front == rear)
return true;
return false;
}
void Queue::add(int x){
if(isFull())
cout << "Queue is full" << endl;
else{
rear++;
Q[rear] = x;
}
}
int Queue::remove(){
int x = -1;
if(isEmpty())
cout << "Queue is empty" << endl;
else{
front++;
x = Q[front];
}
return x;
}
void Queue::display(){
for(int i=front+1; i<=rear; i++)
cout << Q[i] << " ";
cout << endl;
}
int Queue::Front(){
if(isEmpty())
return -1;
return Q[front+1];
}
int main(){
Queue q(5);
q.add(10);
q.add(20);
q.add(30);
q.add(40);
q.add(50);
q.display();
cout << q.remove() << endl;
q.display();
cout << q.Front() << endl;
return 0;
}
Easy
給定一個 ping 函数,每當收到一個時間戳(t),它將返回在過去 3000 毫秒內發生的請求數。
注意 : 每個測試案例都會連續呼叫 ping 函數,並且 t 的值嚴格遞增。
由於這是一個先進先出(FIFO)的情境,我們可以使用佇列(Queue)來處理這個問題。由於時間戳是嚴格遞增的,我們可以在每次調用 ping 函數時將時間戳小於 t - 3000 的請求丟棄,以減少佇列的空間占用。
class RecentCounter {
public:
queue<int> q;
RecentCounter() {
}
int ping(int t) {
q.push(t);
while(q.front() < t-3000)
q.pop();
return q.size();
}
};
/**
* Your RecentCounter object will be instantiated and called as such:
* RecentCounter* obj = new RecentCounter();
* int param_1 = obj->ping(t);
*/
Medium
有 n 位朋友坐成一圈玩遊戲,編號從 1 到 n,依順時針順序排列。
每次計算接下來的 k 個朋友,最後一個被數到的朋友將離開圈子,直到只剩下一位獲勝者。
我們可以使用佇列(Queue)來實現這個遊戲。每次數到 k 的朋友都會被移到佇列的末尾,然後繼續數下去,直到只剩下一位玩家為止。
class Solution {
public:
int findTheWinner(int n, int k) {
queue<int> q;
for(int i = 1 ; i <= n ; i ++ )
q.push(i);
int count=k;
while(q.size()!=1){
int people = q.front();
q.pop();
count--;
if(count)
q.push(people);
else
count = k;
}
return q.front();
}
};