【模板】棧和隊列

//棧 
int st[] ;
void push(int x) 
{   
    st[tp++] = x;
}
void pop() 
{
    --tp;
}
int top() 
{   
    return st[tp-1];
}


//隊列
void push(int x) 
{
    q[tail++] = x;
}
void pop() 
{
    ++head;
}
int front() 
{
    return q[head];
}

單調隊列(以POJ2823爲例)//詢問區間最大最小值:

for(int i = 1;i < k;i ++)
    {
        while(Head <= Tail && Num[Tail] >= v[i]) Tail--;
        Tail++;
        Num[Tail] = v[i];
        Bh[Tail] = i;
    }
    for(int i = k;i <= n;i ++)
    {
        while(Head <= Tail && Num[Tail] >= v[i]) Tail --;
        Tail ++;
        Num[Tail] = v[i];
        Bh[Tail] = i;
        while(Bh[Head] <= i - k) Head ++;
        printf("%d ",Num[Head]);
    }
    printf("\n");
    for(int i = 1;i < k;i ++)
    {
        while(head <= tail && num[tail] <= v[i]) tail --;
        tail ++;
        num[tail] = v[i];
        bh[tail] = i;
    }
    for(int i = k;i <= n;i ++)
    {
        while(head <= tail && num[tail] <= v[i]) tail--;
        tail ++;
        num[tail] = v[i];
        bh[tail] = i;
        while(bh[head] <= i - k) head ++;
        printf("%d ",num[head]);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章