站点图标 陌路寒暄

不同出栈情况(栈和队列)

不同出栈情况(栈和队列)

时间: 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;
}  

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

退出移动版