题目一、栈的输出序列:
思路:
按照元素入栈、出栈,元素从栈中输出这两种情况递归即可。(直接输出等同于先入栈再直接出栈,不会重复)
代码:
#include<bits/stdc++.h>
using namespace std;
void stackPerm(int s,int n,stack<int> &st,vector<int> &arr){
if(arr.size() == n){
for(int i=0;i<n;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
}
if(s <= n){
st.push(s);
stackPerm(s+1,n,st,arr);
st.pop();
}
if(!st.empty()){
int temp = st.top();
st.pop();
arr.push_back(temp);
stackPerm(s,n,st,arr);
st.push(temp);
arr.pop_back();
}
}
int main(){
stack<int> st;
vector<int> arr;
stackPerm(1,4,st,arr);
}
结果:(14种,符合卡塔兰数)
题目二、队列的输出序列:
思路:
1、用队列实现,发现在复制的那一步不好实现,也没调试出来,所以最后应用了双端队列,方便从前后删除数据。(代码中用宏定义修改的)
2、为了不输出相同的数据,代码里设置了pd数组,把已经输出过且不重复的答案放在数组里,每次输出都和数组里已经有的答案比较一下,如果已经输出过,就不再输出。
3、思路:
同样递归,元素可以入队列,可以直接输出,然后队列也可以输出,按这三种情况递归。会有重复。
代码:
#include<bits/stdc++.h>
using namespace std;
#define queue deque//把队列改成双端队列
int pd[100][4];
bool flag(vector<int> &arr,int count){
for(int i=0;i<count;i++){
if(arr[0]==pd[i][0] && arr[1]==pd[i][1] &&arr[2]==pd[i][2] &&arr[3]==pd[i][3]){
return false;
}
}
return true;
}
void queuePerm(int s,int n,queue<int> &st,vector<int> &arr,int &count){
if(arr.size() == n && flag(arr,count)){
for(int i=0;i<n;i++){
cout<<arr[i]<<" ";
pd[count][i]=arr[i];
}
cout<<endl;
count++;
}
if(s <= n){
arr.push_back(s);
queuePerm(s+1,n,st,arr,count);
arr.pop_back();
st.push_back(s);
queuePerm(s+1,n,st,arr,count);
st.pop_back();
}
if(!st.empty()){
int temp = st.front();
st.pop_front();
arr.push_back(temp);
queuePerm(s,n,st,arr,count);
st.push_front(temp);
arr.pop_back();
}
}
int main(){
int count=0;
queue<int> st;
vector<int> arr;
queuePerm(1,4,st,arr,count);
}
结果:(14种)