队列练习题

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)

StackOverFlow(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(!StackOverFlow(s1)){
		push(s1,e);
		return 1;
	}
	if(StackOverFlow&&!StackEmpty(s2)){
		printf("该队列为满");
		return 0;
	}
	if(StackOverFlow&&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);
		}
	
	}


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值