隊列,堆棧和結構體舉例(C語言)

    自己啃算法書整理了一個同時運用堆棧和隊列的代碼,對這塊內容還比較模糊的可以看看~,以下是代碼和註解。(留個贊再走唄!)

//遊戲:小哼和小哈玩小貓釣魚的紙牌遊戲。剛開始每人手中有6張牌,打到最後誰的手中還有牌誰就獲勝

//提示:小哼和小哈手中的牌用隊列表示,桌上的牌用堆棧表示,所有要定義3個結構體,兩個隊列,一個堆棧

#include <stdio.h>

//隊列結構體
struct queue
{
int data[100];
int head;
int tail;
};

//堆棧結構體
struct stack
{
int data[10];
int top;
};

int main()
{
struct queue q1,q2;
struct stack s;
int i,t;
int book[10]={0};//若桌上紙牌1有3張,則book[1]=3;若桌上紙牌5有6張,則book[5]=6

//對隊列的head和tail初始化,剛開始隊列爲空,所以head和tail都是1
q1.head=1;q1.tail=1;//小哼
q2.head=1;q2.tail=1;//小哈

//遊戲開始時,桌上沒有紙牌
s.top=0;

//給小哼發牌
for (i=1;i<=6;i++)
{
	scanf("%d",&q1.data[q1.tail]);
		q1.tail++;
}
//給小哈發牌
for (i=1;i<=6;i++)
{
	scanf("%d",&q2.data[q2.tail]);
	q2.tail++;

}
//6個數字都進入隊列後,tail指向隊列最後一個數的後面一位


while(q1.head<q1.tail && q2.head<q2.tail)//當隊列不爲空的時候執行(即小哼和小哈手中都有牌才能開始遊戲)
{
	t=q1.data[q1.head];//將隊列的第一個數存放在t中(即將要打出的紙牌上的數字)
	if (book[t]==0) //book[t]=0表示桌上沒有和t相同的數
	{
		q1.head++;//將t從q1隊列中出隊,隊列中的下一個數作爲head;(即小哼打出了一張牌)
		s.top++;
		s.data[s.top]=t;//將出隊的t放進s堆棧中(將小哼打出的牌放到了桌上)
		book[t]=1;//此時桌上的紙牌t的張數爲1		
	}
	else 
	{
		//此時小哼可以贏牌
		q1.head++;//隊列中的下一個數作爲head
		q1.data[q1.tail]=t;//將出隊的t重新入隊到隊列q1的末尾tail處
		q1.tail++;
		while (s.data[s.top]!=t)//此時的top指向堆棧s的最頂端(即桌上的最後一張紙牌),該紙牌和t不相等時執行循環
		{
			book[s.data[s.top]]=0;//s.data[s.top]表示桌上最末端的紙牌上的數字,對它取消標記
			q1.data[q1.tail]=s.data[s.top];//將桌上最末端的紙牌放進q1隊列中
			q1.tail++;//tail指向隊列q1最後一個數的後面一位
			s.top--;//top往前移(top往下移,保證top永遠指向堆棧s的最頂端)
		}
	}


	t=q2.data[q2.head];
	if (book[t]==0) //book=0表示桌上沒有和t相同的數
	{
		q2.head++;//將t從q2隊列中出隊,並且head++;(即小哼打出了一張牌)
		s.top++;
		s.data[s.top]=t;//將出隊的t放進s堆棧中(將小哼打出的牌放到了桌上)
		book[t]=1;//此時桌上的紙牌t的張數爲1		
	}
	else 
	{
		//此時小哈可以贏牌
		q2.head++;//將t從q2隊列中出隊
		q2.data[q2.tail]=t;//將出隊的t重新入隊到隊列q2的末尾tail處
		q2.tail++;
		while (s.data[s.top]!=t)//此時的top指向堆棧s的最頂端(即桌上的最後一張紙牌),該紙牌和t不相等時執行循環
		{
			book[s.data[s.top]]=0;//s.data[s.top]表示桌上最末端的紙牌上的數字,對它取消標記
			q2.data[q2.tail]=s.data[s.top];//將桌上最末端的紙牌放進q2隊列中
			q2.tail++;//tail指向隊列q2最後一個數的後面一位
			s.top--;//top往前移(top往下移,保證top永遠指向堆棧s的最頂端)
		}
	}
}

if (q1.head==q1.tail)//表示隊列q1爲空(即小哼手中的牌已全部打出)
{
	printf("小哈獲勝\n");
	printf("小哈手中的牌爲:\n");
	for (i=q2.head;i<=q2.tail-1;i++)
	{
		printf("%d ",q2.data[i]);
	}
	

	if (s.top>0)//s.top>0表示桌上還有牌
	{
		printf("桌上剩餘的紙牌爲:");
		for (i=1;i<=s.top;i++)
		{
			printf("%d ",s.data[i]);
		}
		printf("\n");
	}
	else
		printf("桌上沒有紙牌剩餘");

}
else
{
	printf("小哼獲勝\n");
	printf("小哼手中的牌爲:");
	for (i=q1.head;i<=q1.tail-1;i++)
	{
		printf("%d ",q1.data[i]);
	}
	printf("\n");
	
	if (s.top>0)//s.top>0表示桌上還有牌
	{
		printf("桌上剩餘的紙牌爲:");
		for (i=1;i<=s.top;i++)
		{
			printf("%d ",s.data[i]);
		}
		printf("\n");
	}
	else
		printf("桌上沒有紙牌剩餘");

}

return 0;

}

測試數據:
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章