题意:
给定入栈序列,输出所以的以字典序从小到大排序的出栈序列。
方法一:
全排列函数+栈
思路:从小到大全排列所有的出栈序列。并根据入栈序列判断该出栈序列是否正确;如果正确则输出该出栈序列。根据入栈序列判断该出栈序列是否正确:(图示方法如下)
#include <bits/stdc++.h> using namespace std; int n,a[15],c[15]; //根据入栈序列判断出栈序列是否正确 bool check(int b[]){ stack<int> st;//栈 int j=0; for(int i=0;i<n;i++){//遍历入栈序列 st.push(a[i]); while(!st.empty()&&b[j]==st.top()){//如果栈顶元素等于出栈序列元素,则栈顶元素出栈并出栈序列下标加一 st.pop(); j++; } } return st.empty();//判断栈是否为空 } int main(){ while(cin >> n){ for(int i=0;i<n;i++){//输入入栈序列 cin >> a[i]; c[i]=a[i]; } //排序 sort(c,c+n); //全排列出栈序列 do{ if(check(c)){//如果成功,则输出该出栈序列 for(int i=0;i<n;i++){ cout << c[i] << " "; } cout << endl; } }while(next_permutation(c,c+n)); } return 0; }
时间复杂度:空间复杂度:
方法二:
dfs+栈
思路:利用dfs实现 从小到大全排列所有的出栈序列。再判断每个出栈序列是否正确,正确则输出。
#include <bits/stdc++.h> using namespace std; int n,a[15],c[15],temp[15]; int vis[15]; //根据入栈序列判断出栈序列是否正确 bool check(int b[]){ stack<int> st;//栈 int j=0; for(int i=0;i<n;i++){//遍历入栈序列 st.push(a[i]); while(!st.empty()&&b[j]==st.top()){//如果栈顶元素等于出栈序列元素,则栈顶元素出栈并出栈序列下标加一 st.pop(); j++; } } return st.empty();//判断栈是否为空 } void dfs(int x){ if(x==n){ if(check(temp)){//如果成功,则输出该出栈序列 for(int i=0;i<n;i++){ cout << temp[i] << " "; } cout << endl; } return; } for(int i=0;i<n;i++){//遍历数组 int y=c[i]; if(vis[y]==0){//如果未访问,则访问 vis[y]=1; temp[x]=y; dfs(x+1); vis[y]=0; } } } int main(){ while(cin >> n){ for(int i=0;i<n;i++){//输入入栈序列 cin >> a[i]; c[i]=a[i]; } //排序 sort(c,c+n); //dfs全部的出栈序列 dfs(0); } return 0; }
时间复杂度:空间复杂度: