题目大意:
输入n个数,求出对于1-n的数的全排列的所有情况。
比如 输入数据 3:
则可能的情况有123,132,213,231,312,321.
依题意得:此时需要考虑的因素有输出次数为输入数据的n的阶乘次,同时输出需要带有一定的次序,并且利用栈进行数据的理想实现。
通过多方查阅资料可以得到解决的算法有:
1.通过递归进行实现。
2.通过栈操作进行实现,
对于递归,我这里就不进行实现了,毕竟网络上的教程很多都是关于递归实现这一方法。这里主要介绍比较少的栈实现的方法。
方法核心:
建立 一个循环,将栈中的数据多次弹出,每一次弹出都寻找一次,在栈外的数据有没有比弹出的数据大的,一旦条件成立就将大的这个数据入栈接着将栈外的数据从小到大依次入栈,每一次条件成立,就输出一次。
代码如下:
package Main;
import java.util.*;
import java.math.*;
public class Main1856 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner in = new Scanner(System.in);
int pa=1;
while(in.hasNext()) {
int fa = in.nextInt();
SeqStack1856<Integer> seq = new SeqStack1856<Integer>();
for(int i=1;i<=fa;i++) {
seq.push(i);
}
System.out.println("Case "+pa+++":");
System.out.println(seq);
while(!seq.isEmpty()) {
int i = seq.pop();
// System.out.println(seq.get()+"hhhh ");
for(;i<fa;i++) {
// System.out.println(seq.search(i+1));
if(seq.search(i+1)<0) {
seq.push(i+1);
for(int y=1;y<=fa;y++) {
if(seq.search(y)<0) {
seq.push(y);
}
}
System.out.println(seq);
break;
}
}
}
}
in.close();
}
}
class SeqStack1856<T>{
T[] t;
int top;
public SeqStack1856() {
t = (T[])new Object[1024];
top = -1;
}
public int search(int i) {
// for(int o=0;o<top+1;o++) {
// if(((Integer)(t[o]))==i) {
// System.out.print(t[o]+"hhh");
// }
// }
// System.out.println();
for(int o=0;o<top+1;o++) {
if(((Integer)(t[o]))==i) {
return 1;
}
}
return -1;
}
public boolean isEmpty() {
if(top == -1) {
return true;
}
else
return false;
}
public void push(T x) {
if(x == null) {
return;
}
top++;
t[top] = x;
}
@Override
public String toString() {
String st = "[";
int o;
for( o=0;o<top;o++) {
st+=t[o]+", ";
}
st+=t[o]+"]";
// for(T x:t) {
// if(x!=null)
// st += x+" ";
// }
return st;
}
public T pop() {
if(top == -1) {
return null;
}
T fa = t[top];
top--;
return fa;
}
public T get() {
if(this.isEmpty()) {
return null;
}
return t[top];
}
public int getTop() {
return top+1;
}
}