# 队列
# 循环队列
循环队列的定义和基本操作如下:
// 判空 | |
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); | |
} |