小猫钓鱼——栈和队列的应用(C++)

参考书:《啊哈算法》——啊哈磊

基础知识:
队列:先进先出
栈:后进先出

完整代码如下:

#include <iostream>

using namespace std;

//创建一个结构体用来实现队列
struct queue
{
    int data[1000];
    int head;
    int tail;
};

//创建一个结构体用来实现栈
struct stack
{
    int data[10];
    int top;
};

void DrawCard(queue &q,stack &s,int *book)
{
    int temp=q.data[q.head];   //
    if(book[temp]==0)   //桌面上没有牌面为temp的牌。
    {
        q.head++;
        s.top++;
        s.data[s.top]=temp;
        book[temp]=1;
    }
    else
    {
        q.head++;
        q.data[q.tail]=temp;
        q.tail++;

        //把桌子上可以赢得的牌依次放回手中牌的末尾。

        //放入到手中——入队
        while(s.data[s.top]!=temp)
        {
            book[s.data[s.top]]=0;  //取消标记
            q.data[q.tail]=s.data[s.top];
            q.tail++;
            s.top--;
        }

        //收回桌上牌面为temp的牌——出栈
        book[s.data[s.top]]=0;
        q.data[q.tail]=s.data[s.top];
        q.tail++;
        s.top--;
    }

}

int main()
{
    struct queue q1={{0,2,4,1,2,5,6},1,7};
    struct queue q2={{0,3,1,3,5,6,4},1,7};
    struct stack sk;   sk.top=0;//用来记录桌面上的牌面
    int book[10]={0};  //用来记录桌面上有哪些牌

    //初始化队列和栈  队列head=tail表示队列为空
//    q1.head=1;  q1.tail=1;
//    q2.head=1;  q2.tail=1;
//
//
//
//    for(int i=1;i<=9;i++)
//    {
//        book[i]=0;
//    }
//
//    //小哼手上的6张牌
//    for(int i=1;i<=6;i++)
//    {
//        cin>>q1.data[q1.tail];
//        q1.tail++;
//    }
//
//    //小哈手上的6张牌
//      for(int i=1;i<=6;i++)
//    {
//        cin>>q2.data[q2.tail];
//        q2.tail++;
//    }

    while(q1.head<q1.tail&&q2.head<q2.tail)
    {
        //小哼先出牌,,放到临时变量temp中。
    //判断能否赢得桌上的牌:判断桌面上有么有与temp相同的。

    if(q1.head==q1.tail)
        break;

    DrawCard(q2,sk,book);
    }

    if(q2.head==q2.tail)
    {
        cout<<"小哼win"<<endl;
        cout<<"小哼当前手中的牌是:"<<endl;
        for(int i=q1.head;i<q1.tail;i++)
            cout<<q1.data[i]<<" ";

        if(sk.top>0)
        {
            cout<<"桌面上的牌依次输出为:"<<endl;
            for(int i=1;i<=sk.top;i++)
                cout<<sk.data[i];
        }
        else
            cout<<"桌面上没牌"<<endl;
    }

    else
    {
        cout<<"小哈win"<<endl;
        cout<<"小哈当前手中的牌是:"<<endl;
        for(int i=q2.head;i<q2.tail;i++)
        {
            cout<<q2.data[i]<<" ";
        }

        if(sk.top>0)
        {
            cout<<"桌面上的牌依次输出为:"<<endl;
            for(int i=1;i<=sk.top;i++)
            {
                cout<<sk.data[i]<<" ";
            }
        }
        else
        {
            cout<<"桌面上没牌"<<endl;
        }
    }

    system("pause");
    return 0;
}

代码运行结果为:

小哈win
小哈当前手中的牌是:
1 6 5 2 3 4 1 桌面上的牌依次输出为:
3 4 5 6 2 请按任意键继续. . .

猜你喜欢

转载自blog.csdn.net/zhenaoxi1077/article/details/80313168