1.用标志域tag0或1来区分循环队列空满,请编写入队和出队算法
初始状态:tag=0 front=rear=0
#define Maxsize 100
typedef struct{
int front,rear,tag;
int data[Maxsize];
}Q;
int enque(sqQue &Q,elementype x){
if(Q.front==Q.rear&&Q.tag==1) return 0;
Q.data[Q.rear]=x; //rear指向空位置
Q.rear=(Q.rear+1)%Maxsize;
Q.tag=1; //可能队满
return 1;
}
int deque(sqQue &Q,elementype x){
if(Q.rear==Q.front&&Q.tag==0) return 0;
x=Q.data[Q.front]; //front指向队头元素
Q.front=(Q.front+1)%Maxsize;
Q.tag=0; //可能队空
return 1;
}
2.Q是一个队列,S是一个空栈,实现将队列元素逆置
全部出队入栈,全部出栈入队
void reverse(stack S,queue Q){
while(!QueueEmpty(Q)){
x=Dequeue(Q);
push(S,x); //出队入栈
}
while(!StackEmpty(S)){ //出栈入队
pop(S,x);
Enqueue(Q,x);
}
}
3.用两个栈模拟队列
当需要入队,用s1来存放已输入的元素,即s1执行入栈操作
当需要出队时,则对s2执行出栈操作
由于从栈中取出元素的顺序是原顺序的逆序,所以必须先将s1中的所有元素全部出栈并入栈s2,再从s2中执行出栈,即出队,而在执行此操作前必须判断s2是否空,否则导致顺序混乱,当两个栈都为空时队列为空。
总结:s2为空时,先将s1中所有元素入栈s2。只有s1满s2空时,才能将s1中的全部元素插入s2。
push(S,x)
pop(S,x)
stackempty(S) 空返回1,不空返回0
stackoverflow(S) 满返回1,不满返回0
enqueue
dequeue
queueempty
bool enqueue(stack &s1,stack &s2,elemtype x){
if(!stackoverflow(s1)){ //S1不满
push(s1,x); //入队
return true;
}
if(stackoverflow(s1)&&!stackempty(s2)){ //s1满且s2非空
printf("队列满");
return false; //不允许1到2去//这种情况时不能入队
}
if(stackoverflow(s1)&&stackempty(s2)){
while(!stackempty(s1)){
pop(s1,x);
push(s2,x);
} //s1全部进入s2,s1空
}
push(s1,x); //s1空,可以直接入队(进栈s1)
return true;
}
bool dequeue(stack &s1,stack &s2,elemtype x){
if(!stackempty(s2)){
pop(s2,x);
return true;
}
else if(stackempty(s1)){
printf("队空") ;
}
else{
while(!stackempty(s1)){
pop(s1,x);
push(s2,x);
}
pop(s2,x);
}
}
天勤
6、假设带头结点的循环链表表示队列,设一个指针指向队尾结点,请写出相应的入队出队算法
int Dequeue(Linklist &rear,int &x){
if(rear->next= rear) return 0;
else{
Lnode *p=rear,*temp;
p=rear->next->next;
rear->next->next=p->next;
x=p->data;
if(p==rear) rear=rear->next;
free(p);
return 1;
}
}
7.如果允许在循环队列的两端都可以插入删除,请写出从队尾删除和从队头插入的算法
typedef struct{
int front;
int rear;
int data[Maxsize];
}SqQueue;
int Dequeue(SqQueue &l,int &x){
if(l.front==l.rear) return 0;
else{
x=l.data[l.rear];
l.rear=(l.rear+1)%Maxsize;
return 1;
}
}
int Enqueue(SqQueue &l,int &x){
if((l.rear+1)%Maxsize==front)
return 0;
else{
l.data[l.front]=x;
l.front=(l.front+1)%MaxSize;
return 1;
}
}