在写代码时的一些错误(2)

#include<stdio.h>

struct queue{
	int data[10001];
	int head;
	int tail;
};

struct stack{
	int top;
	int data[10001];
};

int main(){
	
	struct queue q1,q2;
	struct stack stk1;
	int i,j = 1;
	
	q1.head = 1;
	q1.tail = 1;
	q2.head = 1;
	q2.tail = 1;
	stk1.top = 1;
	
	for(i = 1;i <= 6;i ++){                        //每一块之前先检查 
		scanf("%d",&q1.data[q1.tail]);
		q1.tail ++;
	}
	
	printf("start 1:");
	for(i = q1.head;i < q1.tail;i ++){                   
		printf("%d",q1.data[i]);
	}
	printf("\n");
	
	for(i = 1;i <= 6;i ++){
		scanf("%d",&q2.data[q2.tail]);
		q2.tail ++;
	}
	
	printf("start 2:");
	for(i = q2.head;i < q2.tail;i ++){
		printf("%d",q2.data[i]);
	}
	printf("\n");
	
	printf("stack:");
	for(i = 1;i <= stk1.top;i ++){
		printf("%d",stk1.data[i]);
	}
	printf("\n");
	
	while(1){
		
		int rem = stk1.top;
		for(;stk1.top > 0;stk1.top --){
			
			if(q1.data[q1.head] == stk1.data[stk1.top]){
				q1.data[q1.tail] = q1.data[q1.head];
				q1.tail++;
				q1.head++;
				int rem2 = stk1.top;
				stk1.top = rem;
				for(;stk1.top >= rem2;stk1.top --){
					if(stk1.data[stk1.top] != 0){
						q1.data[q1.tail] = stk1.data[stk1.top]; 
						stk1.data[stk1.top] = 0;
						q1.tail ++; 
					}
				}
				stk1.top ++;
				break;
			}
			
		}
		
		printf("1:");
		for(i = q1.head;i < q1.tail;i ++){                   
			printf("%d",q1.data[i]);
		}   
		printf("\n");
		
		if(stk1.top == 0 && j == 1){
			stk1.top = 1;
			stk1.data[stk1.top] = q1.data[q1.head];
			q1.head ++;
			j ++;
		}
		else if(stk1.top == 0){
			    stk1.top = rem + 1;
			    stk1.data[stk1.top] = q1.data[q1.head];
			    q1.head ++; 
				printf("1:");
				for(i = q1.head;i < q1.tail;i ++){                   
					printf("%d",q1.data[i]);
				    }   
			    printf("\n");
		       }
		    else{
				stk1.top = rem;
			}
		
		/*if(stk1.data[--stk1.top] != 0){
		  stk1.data[stk1.top] = q1.data[q1.head];
		  }
		  else{
		  q1.data[q1.tail++] = q1.data[q1.head ++];
		  }*/
		
		printf("1:");
		for(i = q1.head;i < q1.tail;i ++){                   
			printf("%d",q1.data[i]);
		}   
		printf("\n");
		
		printf("stack1:");
		for(i = 1;i <= stk1.top;i ++){
			printf("%d",stk1.data[i]);
		}
		printf("\n");
		
		if(q1.head == q1.tail){
			printf("小哈赢了!\n");
			printf("手牌:");
			for(i = q2.head;i < q2.tail;i ++){
				printf("%d ",q2.data[i]);
			}
			printf("\n");
			printf("桌上的牌:");
			for(i = 1;i <= stk1.top;i ++){
				if(stk1.data[i] != 0)
				   printf("%d ",stk1.data[i]);
			}
			break;
		}
		
		rem = stk1.top;
		for(;stk1.top > 0;stk1.top --){
			if(q2.data[q2.head] == stk1.data[stk1.top]){
				q2.data[q2.tail] = q2.data[q2.head];
				q2.tail++;
				q2.head++;
				int rem2 = stk1.top;
				stk1.top = rem;
				for(;stk1.top >= rem2;stk1.top --){
					if(stk1.data[stk1.top] != 0){
						q2.data[q2.tail] = stk1.data[stk1.top]; 
						stk1.data[stk1.top] = 0;
						q2.tail ++; 
					}
				}
				break;
			}
		}
		
		if(stk1.top == 0){
			stk1.top = rem + 1;
			stk1.data[stk1.top] = q2.data[q2.head];
			q2.head ++; 
		}
		
		printf("2:");
		for(i = q2.head;i < q2.tail;i ++){
			printf("%d",q2.data[i]);
		}
		printf("\n");
		
		printf("stack2:");
		for(i = 1;i <= stk1.top;i ++){
			printf("%d",stk1.data[i]);
		}
		printf("\n");
		
		if(q2.head == q2.tail){
			printf("小哼赢了!\n");
			printf("手牌:");
			for(i = q1.head;i < q1.tail;i ++){
				printf("%d ",q1.data[i]);
			}
			printf("\n");
			printf("桌上的牌:");
			for(i = 1;i <= stk1.top;i ++){
			   if(stk1.data[i] != 0)
			     printf("%d ",stk1.data[i]);
			}
			break;
		}
		
	}
	
}

 放牌的顺序调整过来了后的正确代码

for(;stk1.top >= rem2;stk1.top --){
					if(stk1.data[stk1.top] != 0){
						q1.data[q1.tail] = stk1.data[stk1.top]; 
						stk1.data[stk1.top] = 0;
						q1.tail ++; 
					}
				}

stk1.top --即使没有的也会把

突然发现这里的5直接跑到栈里面了,本来收完一轮牌后是到2号线出牌了

看起来是

if(stk1.top == 0 && j == 1){
			stk1.top = 1;
			stk1.data[stk1.top] = q1.data[q1.head];
			q1.head ++;
			j ++;
		}
		else if(stk1.top == 0){
			    stk1.top = rem + 1;
			    stk1.data[stk1.top] = q1.data[q1.head];
			    q1.head ++; 
				/*/printf("1:");
				for(i = q1.head;i < q1.tail;i ++){                   
					printf("%d",q1.data[i]);
				    }   
			    printf("\n");*/
		       }

这里面的问题,但是我没有看出来,所以动用了printf打印结果的方式来检查错误

这个操作里面的可能错误的部分(如果两个(if else)都有就不知道是谁的问题了)

发现是

else if(stk1.top == 0){
			    stk1.top = rem + 1;
			    stk1.data[stk1.top] = q1.data[q1.head];
			    q1.head ++; 
				/*/printf("1:");
				for(i = q1.head;i < q1.tail;i ++){                   
					printf("%d",q1.data[i]);
				    }   
			    printf("\n");*/
		       }

这里

因为5是收完牌给出去的 stk.top搜索到1的位置的时候

for(;stk1.top > 0;stk1.top --){
			
			if(q1.data[q1.head] == stk1.data[stk1.top]){
				q1.data[q1.tail] = q1.data[q1.head];
				q1.tail++;
				q1.head++;
				int rem2 = stk1.top;
				stk1.top = rem;
				for(;stk1.top >= rem2;stk1.top --){
					if(stk1.data[stk1.top] != 0){
						q1.data[q1.tail] = stk1.data[stk1.top]; 
						stk1.data[stk1.top] = 0;
						q1.tail ++; 
					}
				}
				//stk1.top ++;
				break;
			}
			
		}

这里面的

stk1.top --导致stk1.top == 0,所以启动了

else if(stk1.top == 0){
			    stk1.top = rem + 1;
			    stk1.data[stk1.top] = q1.data[q1.head];
			    q1.head ++; 
				/*/printf("1:");
				for(i = q1.head;i < q1.tail;i ++){                   
					printf("%d",q1.data[i]);
				    }   
			    printf("\n");*/
		       }

导致5被传到了stk1.data[2](因为stk1.top = rem + 1)

由于我的设计是这样,所以和第一个和stk1.data[1]相同的数才会出现这种情况,因此只需要

if(q1.data[q1.head] == stk1.data[stk1.top]){
				q1.data[q1.tail] = q1.data[q1.head];
				q1.tail++;
				q1.head++;
				int rem2 = stk1.top;
				stk1.top = rem;
				for(;stk1.top >= rem2;stk1.top --){
					if(stk1.data[stk1.top] != 0){
						q1.data[q1.tail] = stk1.data[stk1.top]; 
						stk1.data[stk1.top] = 0;
						q1.tail ++; 
					}
				}
				//stk1.top ++;
				break;
			}

的break之前、for循环之后放上

//stk1.top ++;

即可

又是临界值问题。

看了这么多问题——其实都是临界值问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值