[代码源] #114. 出栈序列 dfs+STL

前言

传送门 :

题意

给定一个 1...2.. n 1...2..n 1...2..n,输出其所有入栈出栈的可能

思路

我们可以先将所有数放进栈中,然后再考虑出栈

因为是从 1... n 1...n 1...n的缘故,因此我们需要逆序存入栈中

然后开始考虑 d f s dfs dfs

每次 d f s dfs dfs我们考虑从定义的栈中拿出一个数,放进我们的等待栈

如果等待栈有元素,也就是出战的队列我们考虑将其栈顶放进答案序列

然后下面就是 拿一个,放进等待栈,放进答案…

code

int n;
stack<int> endd,stk;
vector<int> ans;

void dfs(vector<int> ans,stack<int> stk,stack<int> endd){
	if(ans.size() == n){
		for(auto x : ans){
			cout<<x<<" ";
		}
		cout<<endl;
		return;
	}

	stack<int> stk_tmp = stk;
	vector<int> ans_tmp = ans;

	if (!stk.empty()) {
		ans.push_back(stk.top());
		stk.pop();
		dfs(ans,stk,endd);
	}

	if (!endd.empty()) {
		stk_tmp.push(endd.top());
		endd.pop();
		dfs(ans_tmp,stk_tmp,endd);
	}
}


void solve(){
	cin>>n;
	for(int i = n ;i >=1; i -- )endd.push(i);
	dfs(ans,stk,endd);

}

int main(){
	IOS
	CIT
	COT
    //int t;cin>>t;while(t--)
    solve();
    return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值