栈与队列(2021-07-08晚)

考研 ing
努力努力再努力
**

第三章 栈与队列

1.循环队列带标志位

入队
int EnQueue(SqQueue &Q,ElemType x){
	if(Q.rear==Q.front&&Q.tag==1)
	return 0;
	Q.data[Q.rear]=x;
	Q.rear=(Q.rear+1)%MaxSize;
	Q.tag=1;
	return 1;
}

出队
int DeQueue(SqQueue &Q,ElemType &x){
	if(Q.front==Q.rear&&Q.tag==0)
	return 0;
	x=Q.data[Q.front];
	Q.front=(Q.front+1)%MaxSize;
	Q.tag=0;
	return 1;
}

2.用栈实现队列元素逆置

void Inverser(Stack &S,Queue &Q){
	while(!QueueEmpty(Q)){
		x=DeQueue(Q);
		Push(S,x);
	}
	while(!StackEmpty(S)){
		Pop(S,x);
		EnQueue(Q,x);
	}
}

3.两个栈实现队列运算

思想:
1.入队为栈1入队,出队为栈1先进入栈2,再由栈2出栈。
2.入队时若栈1满,栈2空先将栈1移入栈2;若栈2已有元素则失败。
3.队列空指的是两个栈均空。

入队
int EnQueue(Stack &S1,Stack &S2,ElemType e){
	if(!StackOverflow(S1)){
		Push(S1,e);
		return 1;
	}
	if(StackOverflow(S1)&&!StackEmpty(S2)){
		printf("队列满");
		return 0;
	}
	if(StackOverflow(S1)&&StackEmpty(S2)){
		while(!StackEmpty(S1)){
			Pop(S1,x);
			Push(S2,x);
		}
	}
	Push(S1,e);
	return 1;
}

出队
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,e);
				Push(S2,e);
			}
			Pop(S2,x);
		}
}

判空
int QueueEmpty(Stack &S1,Stack &S2){
	if(StackEmpty(S1)&&StackEmpty(S2))
		return 1;
	else
		return 0;
}

4.括号匹配问题

bool BracketsCheck(char *str){
	InitStack(S);
	int i=0;
	while(str[i]!='\0'){
		switch(str[i]){
			case'(': Push(S,'(');break;
			case'[': Push(S,'[');break;
			case'{': Push(S,'{');break;
			case')': Pop(S,e);
					if(e!='(') return false;
					break;
			case']': Pop(S,e);
					if(e!='[') return false;
					break;
			case'}': Pop(S,e);
					if(e!='{') return false;
					break;
			default: break;
		}
		i++;
	}
	if(!IsEmpty(S))
		return false;
	else
		return true;
}

5.火车硬座软座调换

void Train_Arrange(char *train){
		char *p=train, *q=train,c;
		stack S;
		InitStack(S);
		while(*p!='\0'){
			if(*p=='H')
				Push(S,*p);
			else
				*(q++)=*p;
			p++;
		}
		while(!IsEmpty(S)){
			Pop(S,c);
			*(q++)=c;
		}
	}

6.一个栈实现递归函数计算
在这里插入图片描述

double p(int n,double x){
	struct stack{
		int no;
		double val;				//保存Pn的值
	}st[MaxSize];
	int top=-1,i;
	double fv1=1,fv2=2*x;
	for(i=n;i>=2;i--){
		top++;
		st[top].no=i;
	}
	while(top>=0){
		st[top].val=2*x*fv2-2*(st[top].no-1)*fv1;
		fv1=fv2;
		fv2=st[top].val;
		top--;
	}
	if(n==0)	return fv1;
	else	return fv2;
}

7.渡口管理

Queue q;							//渡船载渡队列
Queue q1;							//客车队列				
Queue q2;							//货车队列
void manager(){
	int i=0,j=0;
	while(j<10){
		if(i<4&&!QueueEmpty(q1)){
			Dequeue(q1,x);
			Enqueue(q,x);
			i+++,j++;
		}
		else if(i=4&&!QueueEmpty(q2)){
			Dequeue(q2,x);
			Enqueue(q,x);
			j++,i=0;
		}
		else{
			while(j<10&&i<4&&!QueueEmpty(q2)){
				Dequeue(q2,x);
				Enqueue(q,x);
				i++,j++;
			}
			i=0;
		}
		if(QueueEmpty(q1)&&QueueEmpty(q2))
			j=11;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值