栈和队列的应用p90 1-4

1.括号配对

扫描每个字符,遇到左括号进栈,遇到右括号时检查栈顶是否为相应左括号,若是:退栈,否则匹配错误,最后若栈不空也为匹配错误。

bool BracketCheck(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,x);if(x!='(') return false;break;
		case '}': pop(s,x);if(x!='{') return false;break;
		case ']': pop(s,x);if(x!='[') return false;break;
		default: break;
		}
		i++;
	}
	if(!isEmpty(s)){
		 printf("括号不匹配");
		 return false;
	}
	else{
		printf("括号匹配");
		return true;	
	}
	
}
bool isValid(char * s){
    int i=0,top=0;
    char *stack[strlen(s)];

    while(s[i]!='\0'){
        if(s[i]=='('||s[i]=='['||s[i]=='{') stack[top++]=s[i];
        else {
            if(--top<0) return false;
            if(s[i]==')'&&stack[top]!='(') return false;
            if(s[i]==']'&&stack[top]!='[') return false;
            if(s[i]=='}'&&stack[top]!='{') return false;
        }
        i++;
    }
    return (!top);
}

2.车厢调度,两侧单向行驶道,有n节硬座和软座车厢等待调度,对n节车厢做入栈出栈操作,使所有软座排在硬座车厢之前

所有车厢依次前进逐一检查,硬座车厢入栈,等待调度,检查完之后对硬座车厢出栈。

void Train_arrange(char *train){
	char *p=train,*q=train,c;
	stack s;
	Initstack(s);
	
	while(p!=NULL){
		if(*p=='H') push(s,'H');
		else *(q++)=*p;
		p++;		
	}
	while(!stackEmpty){
		pop(s,c);
		*(q++)=c;
	}
}

3.利用栈实现以下递归函数的非递归计算(可以把结构做数组用,结构定义可以在函数内)

设置一个栈用于保存n和对应的Pn(x)值,栈中相邻元素的Pn(x)有题中关系。然后边出栈边计算Pn(x),栈空时得到答案。

(借图https://blog.csdn.net/qq_33514421

double p(int n,double x){
	struct stack{
		int no;
		double val;
	}st[MaxSize]; //  顺序栈 
	
	int top=-1,i;
	double fv1=1,fv2=2*x; //通过初始值计算其余值
	 
	for(i=n;i>=2;i--){   //存入n的值 
		top++;
		st[top].no=i;
	}
	
	while(top>=0){        //每次循环通过两个值计算出新值存到val中 
		st[top].val=2*x*fv2-2*(st[top].no-1)*fv1;
		fv1=fv2;
		fv2=st[top].val;
		top--;    //循环结束时fv2中保存着最后结果 
	}
	if(n==0) return fv1;     //条件 1  
	return fv2;
}

4.汽车过江渡船问题

汽车轮渡口,每次可10辆过江。同类车先到先上船。客车先于货车上传,每上四辆客车,可以上一辆货车。客车不足四辆则货车代替。若无货车等待,允许所有客车上船。

设数组q最大下标为10。假设客车队列为q1,货车队列为q2。若q1充足,则每取四个q1后取一个q2,直到q长度为10.若q1不足,则直接用q2补齐。

Queue q,q1,q2;  //q1客车队列 q2货车队列 
void manager(){
	int i=0,j=0;         //i计数4辆,j计数车总数 
	
	while(j<10){
		if(!QueueEmpty(q1)&&i<4){  //上四辆客车 
			Dequeue(q1,x);
			Enqueue(q,x);
			i++;
			j++;
		}
		else if(i==4&&!QueueEmpty(q2)){ //四辆客车后上一辆货车 
			Dequeue(q2,x);
			Enqueue(q,x);
			i=0;    //每上一辆货车i重新计数 
			j++;
		}
		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; //都不足你也得走 
	}
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值