UVaOJ 120 - Stacks of Flapjacks

120 - Stacks of Flapjacks

题目看了半天......英语啊!!!

好久没做题...循环输入数字都搞了半天...罪过啊!!!

还是C方便一点...其实C++应该更方便的...C++得再看看!!!

#include <iostream>

#include <cstdio>



using namespace std;



/*翻转*/

void myReverse(int arr[],int s,int e)    

{

    while (s<e)

    {

        int temp=arr[s];

        arr[s]=arr[e];

        arr[e]=temp;

        s++;

        e--;

    }

}



int main(void)

{

    int temp;

    while (scanf("%d",&temp)!=EOF)

    {

        int myArr[30];

        myArr[0]=temp;

        int myCount=1;



        while (getchar()!='\n')

        {

            cin>>myArr[myCount++];

        }



        /*输出原始的*/

        for (int i=0;i<myCount-1;i++)

        {

            cout<<myArr[i]<<" ";

        }

        cout<<myArr[myCount-1]<<endl;



        for (int i=myCount-1;i>=0;i--)   //针对此次最大的数

        {

            /*先找到此次最大数的位置*/

            int thisMaxIndex=i;    //注意记录的是下标

            for (int j=i-1;j>=0;j--)

            {

                if (myArr[j]>myArr[thisMaxIndex])

                {

                    thisMaxIndex=j;

                }

            }



            if(thisMaxIndex==i)   //此次的最后一个已经是最大的了,不要操作

            {

                continue;

            }

            else if(thisMaxIndex==0)   //最大的第一个数,

            { 

                cout<<(myCount-i)<<" ";   //直接从后面翻一下,注意输出

                myReverse(myArr,0,i);

            }

            else

            {

                cout<<(myCount-thisMaxIndex)<<" ";

                myReverse(myArr,0,thisMaxIndex);

                i++;   //再继续此次循环

            }

        }



        cout<<"0\n";   //最后输出0;

    }

    return 0;

}

 

总结:

1.while (scanf("%d",&temp)!=EOF)的循环输入判读

2.while (getchar()!='\n')  {  cin>>myArr[myCount++];} 看输入,读了一个数字之后紧接着要么是一个空格,要么是结尾的换行符,这里这代码漂亮!空格读了就不要了然后直接读数字,是换行就退出了循环,紧密结合了实际!

3.每次循环的处理,最外层是由后向前,保证处理过的都是有序的大的数.每次循环,要是不合要求再 i-- ,即再来这次循环!

你可能感兴趣的:(stack)