求解栈和队列的可能输出序列

题目一、栈的输出序列:

思路:

按照元素入栈、出栈,元素从栈中输出这两种情况递归即可。(直接输出等同于先入栈再直接出栈,不会重复)

代码:
#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种)

猜你喜欢

转载自blog.csdn.net/Sunnyztg/article/details/128349098