天天写算法之队列与栈的应用之Flipper

地址: 点击打开链接
利用堆栈的性质实现数据反转,没什么技术,但是卡了半天,就是scanf的输入,最后都改成了cin
#include<iostream>
#include<cstdio>
#include<string.h>
#include<stack>
#include<queue>
using namespace std ;
#define MAX 105
struct Node{
    int num ;
    char state ;
};
Node nodes[MAX];
stack<Node> reverse_stack;
queue<Node> reverse_queue ;
void stackReverse(stack<Node>&from , queue<Node>&to ){

    Node temp ;
    while(!from.empty())
    {
        temp =from.top();   from.pop();
        if(temp.state=='U')
            temp.state ='D' ;
        else
            temp.state ='U' ;
        to.push(temp);
    }
    while(!to.empty())
    {
        from.push(to.front());
        to.pop();
    }
}

void trans(stack<Node>&from  , stack<Node>&to)
{
    int index = 1 ;
    while(!to.empty())
    {
        reverse_stack.push(to.top());
        to.pop();
    }
    while(!from.empty())
    {
       reverse_stack.push(from.top());
       from.pop();
    }
    while(!reverse_stack.empty())
    {
        nodes[index++] = reverse_stack.top();
        reverse_stack.pop();
    }
}
int main(){
    int Num,state ,i,j;
    char opt ;
    int case_num = 1 ;
    while(scanf("%d",&Num)&&Num!=0)
    {
        stack<Node> left_stack;
        stack<Node> right_stack;
        for(i= 1;i <=Num ; i ++ )
        {
            cin>>nodes[i].state;
            nodes[i].num = i;
        }
        int from = 1, to = Num;
        left_stack.push(nodes[from]);
        right_stack.push(nodes[to]);
        while(from!=to-1)
        {
            cin >> opt;
            if(opt=='R')
            {
                to--;
                stackReverse(right_stack,reverse_queue);
                right_stack.push(nodes[to]);
            }else {
                from ++;
                stackReverse(left_stack,reverse_queue);
                left_stack.push(nodes[from]);
            }
        }
        cin >> opt;
        if(opt == 'R')
        {
            stackReverse(right_stack,reverse_queue);
            trans(right_stack,left_stack);
        }
        else
        {
             stackReverse(left_stack,reverse_queue);
             trans(left_stack,right_stack);
        }
        scanf("%d",&Num);
        int temp ;
        printf("Pile %d\n",case_num++);
        for(i = 1 ; i <= Num ; i ++)
        {
            scanf("%d",&temp);
            if(nodes[temp].state == 'U')
                printf("Card %d is a face up %d.\n",temp ,nodes[temp].num);
            else
                printf("Card %d is a face down %d.\n",temp ,nodes[temp].num);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36616268/article/details/80158974