入栈出栈式排序,只能从栈顶到指定位置进行倒序操作;
主要思路:
①最大值在栈底,不需要操作
②最大值在栈顶,一次倒序即可
③以上两者都不满足,需进行两次倒序,第一次与最大值位置,第二次与栈底
#include <iostream>
#include <string>
#include <sstream>
#include <cstdio>//用到c里面的函数必须要调,否则printf()使用会出问题
using namespace std;
int pan[40];
int pan_len;
int max_pos(int left,int right)
{
int max=left;
for(int i=left+1;i<=right;i++)
if(pan[i]>pan[max])
max=i;
return max;
}
void reverse(int left,int right)
{
for(int i=left,j=right;i<j;i++,j--)
{
int temp=pan[i];
pan[i]=pan[j];
pan[j]=temp;
}
}
int main()
{
string line;
while(getline(cin,line))
{
cout<<line<<endl;//漏写,注意输出格式!
int a;
pan_len=1;
istringstream sin(line);
while(sin>>a)
pan[pan_len++]=a;
int n=pan_len-1;
while(n>=1)
{
int pos=max_pos(1,n);
if(pos==n)
{
n--;
continue;
}
else if(pos==1)
{
reverse(1,n);
printf("%d ",pan_len-n);
}
else
{
reverse(1,pos);
printf("%d ",pan_len-pos);
reverse(1,n);
printf("%d ",pan_len-n);
}
n--;
}
printf("%d\n",0);
}
return 0;
}