队列练习题

1  设置一个标志域tag,并以tag的值为0或1,来区分对头指针front和队尾指针rear相同时的队列状态是“空”还是“满”。试编写此结构相应的入队和出对的算法 

#define MaxSize50
typedef struct{
	ElemType data[MaxSize];
	int front,rear;//这里用的是数字来进行表明的
}SqQueue;

/循环队列需要用到数组来保存队列

//入队操作考虑队满的情况
int EnQueue( SqQueue &Q,Elemtype x){
	if(front==rear&&tag==1){
		return 0;
	}
	Q.data[rear]=x;//rear指针指向的是下一个元素的位置
	Q.rear=(Q.rear+1)%Maxsize;//队尾指针向后移动
	Q.tag=1;//在这里标明的是上一步进行的操作1
	return 1;
}
//出对考虑队空的情况
int DnQueue( SqQueue &Q,Elemtype x){
	if(front==rear&&tag==0){
		return 0;//表明队空
	}
	x=Q.data[rear];
	Q.rear=(Q.rear-1)%MaxSize;
	Q.tag=0;
	return 1;
}

2 Q是一个队列,S是一个空栈,并且将队列中的元素逆置

//该题主要利用了栈和队列的特性,只要将队列的元素全部入栈,然后出栈,需要注意的是,每出一个元素就进队
int  Revese(Queue &Q ,Stack &S){
	while(!QueueEmpty(Q)){
		x=Dequeue(Q);
		Push(S,x);
	}
	while(!Stack(S)){
		Pop(S,x);//在这里Pop函数x是弹出的栈顶元素,在Pop函数中
		Enqueue(Q,x);
	}
//在这里补充Pop函数
	bool Pop(SqStack &S,ElemType &x){
		if(S.top==-1){
			return false;
		}
		x=S.data[S.top--];
		return true;
	
	}
}

3利用两个栈S1,S2来模仿一个队列,已知栈的4个运算定义

Push(S,x)

Pop(S,x)

StackEmpty(S)

*(S)

思想://该题的思想是通过两个栈来进行队列的实现,考虑到栈的队列的特性,即同时入栈和入队(同一序列数字假设),
//通过两次栈的反转就可以实现队列
入队操作:如果S1满必须保证S2为空,才能将S1中的元素全部插入S2中,然后在进行S1入栈操作
出对操作:对S2的出栈操作做出对操作,如果S2为空,先将S1中的所有元素送入S2,再对栈S2进行出栈操作


//该题的思想是通过两个栈来进行队列的实现,考虑到栈的队列的特性,即同时入栈和入队(同一序列数字假设),
//通过两次栈的反转就可以实现队列
入队操作:如果S1满必须保证S2为空,才能将S1中的元素全部插入S2中,然后在进行S1入栈操作
出对操作:对S2的出栈操作做出对操作,如果S2为空,先将S1中的所有元素送入S2,再对栈S2进行出栈操作i
入队算法
int Enqueue(Stack &s1,Stack &s2,ElemType e){
	if(!*(s1)){
		push(s1,e);
		return 1;
	}
	if(*&&!StackEmpty(s2)){
		printf("该队列为满");
		return 0;
	}
	if(*&&StackEmpty(s2)){
		while(StackEmpty(s1)){
			pop(s1,x);
			push(s1,x);
		}
	}
	push(s1,e);
} 
//出队算法
void DeQueue(Stack &s1,Stack &s2,ElemType &x){
	if(!StackEmpty(s2)){
		pop(s2,x);
	}
	else{
		if(StackEmpty(s1)){
			printf("队列为空");
		}
		else{
			while(!StackEmpty(s1)){
				pop(s1,x);
				push(s2,x);
			}
			pop(s2,x);
		}
	
	}


}

上一篇:LinuxMint下的Orionode源码安装


下一篇:含泪写完!我终于学会了循环队列