不同出栈情况(栈和队列)
时间: 1ms 内存:1000M
描述:
假设有n个元素依次进栈,给出他们不同的出栈情况。输入n与元素。
输入:
3
1 2 3
输出:
1 2 3
1 3 2
3 2 1
2 1 3
2 3 1
示例输入:
2
1 2
示例输出:
1 2
2 1
提示:
参考答案(内存最优[752]):
#include<stdio.h>
#include<string.h>
char tmp[10];
int n;
void f(int pos,int len,char s[])
{
int i,j,t=0;
char c[10];
if(len==strlen(s)-1)
{
t=len-1;
tmp[pos]=s[len];
for(j=1;j<len+1;j++)
{
tmp[pos+j]=s[t];
t--;
}
for(i=0;i<n-1;i++)
printf("%c ",tmp[i]);
printf("%c\n",tmp[i]);
return;
}
tmp[pos]=s[len];
memset(c,0,sizeof(c));
for(i=0;i<strlen(s);i++)
{
if(i!=len)
{
c[t]=s[i];
t++;
}
}
if(len>0)
len--;
for(i=len;i<strlen(c);i++)
{
f(pos+1,i,c);
}
return;
}
int main()
{
int i=0;
char s[10];
memset(s,0,sizeof(s));
scanf("%d",&n);
for(i=0;i<n;i++)
s[i]=i+'1';
for(i=0;i<n;i++)
f(0,i,s);
return 0;
}
参考答案(时间最优[0]):
#include<stdio.h>
#include<string.h>
char tmp[10];
int n;
void f(int pos,int len,char s[])
{
int i,j,t=0;
char c[10];
if(len==strlen(s)-1)
{
t=len-1;
tmp[pos]=s[len];
for(j=1;j<len+1;j++)
{
tmp[pos+j]=s[t];
t--;
}
for(i=0;i<n-1;i++)
printf("%c ",tmp[i]);
printf("%c\n",tmp[i]);
return;
}
tmp[pos]=s[len];
memset(c,0,sizeof(c));
for(i=0;i<strlen(s);i++)
{
if(i!=len)
{
c[t]=s[i];
t++;
}
}
if(len>0)
len--;
for(i=len;i<strlen(c);i++)
{
f(pos+1,i,c);
}
return;
}
int main()
{
int i=0;
char s[10];
memset(s,0,sizeof(s));
scanf("%d",&n);
for(i=0;i<n;i++)
s[i]=i+'1';
for(i=0;i<n;i++)
f(0,i,s);
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。