#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 ++;
即可
又是临界值问题。
看了这么多问题——其实都是临界值问题