自己啃算法書整理了一個同時運用堆棧和隊列的代碼,對這塊內容還比較模糊的可以看看~,以下是代碼和註解。(留個贊再走唄!)
//遊戲:小哼和小哈玩小貓釣魚的紙牌遊戲。剛開始每人手中有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;
}
測試數據:
在這裏插入圖片描述