# 队列

# 循环队列

循环队列的定义和基本操作如下:

// 判空
bool isEmpty(SqQueue Q) {
    if(Q.rear == Q.front) return true;
    else return false;
}
// 判满
bool isFull(SqQueue Q) {
    if(Q.front == ((Q.rear+1)%Q.maxSize)) return true;
    else return false;
}

# 应用

# 阻塞队列

实现线程的阻塞和唤醒。

# 题目

例 1 用两个栈模拟一个队列。栈提供的运算包括:

Push(stack S, int x);     // 元素 x 入栈 s
Pop(stack S, int x);      // S 出栈并将出栈的值赋给 x
StackEmpty(stack S);      // 判断栈是否空
StackOverflow(stack S);   // 判断栈是否满

实现如下:

双栈模拟队列
// 元素 x 入队
int Enqueue(stack &S1, stack &S2, int x) {
    while(!StackEmpty(S2) && StackOverflow(S1)) {
        int t = 0;
        Pop(S2, t);
        Push(S1, t);
    }
    if (StackOverflow(S1) && !StackEmpty(S2))
        return -1; // failed
    Push(S2, x);
    return 0; // succeed
}
// 出队,并赋值至 x
int Dequeue(stack &S1, stack &S2, int x) {
    while(!StackEmpty(S1) &&StackOverflow(S2)) {
        int t = 0;
        Pop(S1, t);
        Push(S2, t);
    }
    if (StackEmpty(S1)) Pop(S2, x);
    else Pop(S1, x);
    return 0;
}
bool QueueEmpty() {         // 判断队列是否为空
    return StackEmpty(S1) && StackEmpty(S2);
}