给定入栈序列,求出合法的出栈序列的个数

思想:1、利用全排列函数next_permutation()求出所有可能的序列

2、从中选出所有正确的序列

#include <iostream>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;

//判断序列是否是合法的出栈序列
bool IsPopOrder(const int* pPush,const int* pPop,int n)
{
	if (pPush == NULL || pPop == NULL || n == 0)
		return false;

	int i = 0;
	int j = 0;
	stack<int> s;
	while (i < n){
		if (!s.empty() && pPop[j] == s.top()){
			s.pop();
			++j;
		}
		else{
			s.push(pPush[i++]);
		}
	}
	while (j<n && pPop[j] == s.top()){
		s.pop();
		++j;
	}
	if (j == n )
		return true;
	else
		return false;
}

int main()
{
	vector<int> vPush;
	vector<int> vPop;
	int n = 0;
	cin >> n;
	int tmp = 0;
	for (int i = 0; i < n; ++i){
		cin >> tmp;
		vPush.push_back(tmp);
		vPop.push_back(tmp);
	}
	sort(vPush.begin(),vPush.end());

	int count = 0;
	//循环判断所有的序列是否合法
	while(1){
		int* pPush = &vPush[0];
		int* pPop = &vPop[0];
		count += IsPopOrder(pPush, pPop, n);
		if (next_permutation(vPop.begin(), vPop.end()) == false)
			break;
	}
	cout << count << endl;

	system("pause");
	return 0;
}

《完》

时间: 2024-08-03 16:58:16

给定入栈序列,求出合法的出栈序列的个数的相关文章

栈与队列问题1——出栈序列

问题描述:栈是常用的一种数据结构,有n个元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列.你已经知道栈的操作有两种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出.现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列.请你编程求出对于给定的n,计算并输出由操作数序列1,2,…,n,经过一系列操作可能得到的输出序列总数. 分析:之前就有看过这种问题.就是火车进站问题,判断序列是否合法,当时是用STL栈做的.这个题只需统计次数,那么,方法就十分简便了,递归和动归都可以实现,当然

C语言强化(二)设计可以求最小元素的栈

上一篇详解了二叉树转双向链表,此篇作为[C语言强化]系列第二篇,来聊聊有关栈的一道题, 通过这道题,你可以掌握 如何使用栈"先进后出"的特性 如何巧妙地借助辅助栈 如何在结构体中定义可共享的静态成员变量 题目 看似很简单的求最小值函数,思路有很多很多.笔者首先想到每次push入栈都进行一次排序,使这个栈的栈顶永远是最小元素,然后就发现这是一个很蠢很蠢的想法,第一这样做会改变了栈的结构,第二不满足题目对时间复杂度的要求. 愚蠢归愚蠢,还是有点用的.既然不能改变原来栈的结构,那为何不弄俩栈

给定入栈序列,判断一个串是否为出栈序列

剑指offer22:给定入栈序列,判断一个串是否为出栈序列 public static boolean isOutStackSequence(int[] Spush, int[] Spop) { if (Spush.length <= 0 || Spop.length <= 0 || Spush.length != Spop.length) return false; int len = Spush.length; Stack<Integer> s = new Stack<I

给定入栈顺序,判断出栈顺序是否合法

题目描述:给定一个入栈序列,给定一个出栈序列,判断该出栈序列是否合法. 分析:假如入栈序列为1 2 3 4 5,判断4 5 3 2 1 是否是合法的出栈顺序. 两个序列均以数组的形式给出 从两个数组的第一个元素开始,如果栈为空,或者,栈顶元素不等于当前出栈数组当前下标对应的元素时,将当前入栈数组中下标所指向的元素进行压栈 初始状态如下: 步骤1:把 1 进行压栈,并将下标后移,如下图所示, 步骤2:依次进行判断并压栈,当4进栈后,此时栈顶元素等于出栈数组下标所指向的元素,将4出栈,如下图所示 步

关于给定栈求出所有合法栈的思考

前几天看到一篇关于给定几个元素,给一个出栈的顺序,判断出栈的顺序是否合法,我们也可以通过给定的元素顺序求出所有的合法的出栈顺序,困扰我的问题是如何求出给定元素的所有的排列问题,之前有篇博文也有求三个数的全序列的,但采用的是三个for循环,实在是too young too simple,效率低不说,而且没有一点实用性,总不能几个数几个for循环,这也太傻了(). 对于判断出栈的合法性问题,我先把思想写出来,至于代码实现需要过两天,求所有的合法出栈顺序有两种思路. 方案1:一种是将所有元素的排列求出

栈的实现,入栈判断是否Full,出栈判断是否Empty

#栈的实现,入栈判断是否Full,出栈判断是否Empty class Stack(): def __init__(st,size): st.stack=[]; st.size=size; st.top=-1; def push(st,content): if st.Full(): print "Stack is Full!" else: st.stack.append(content) st.top=st.top+1 def Out(st): if st.Empty(): print

在堆栈中,push为入栈操作,pop为出栈操作

LinkedList提供以下方法:(ArrayList无此类方法) addFirst(); removeFirst(); addLast(); removeLast(); 在堆栈中,push为入栈操作,pop为出栈操作. Push用addFirst():pop用removeFirst(),实现后进先出. 用isEmpty()--其父类的方法,来判断栈是否为空. 在队列中,put为入队列操作,get为出队列操作. Put用addFirst(),get用removeLast()实现队列. 1 pac

c语言:实现对于给定的正整数N,依次打印出小于等于N的所有素数。两种方法及其优化

请编写一个程序,实现对于给定的正整数N,依次打印出小于等于N的所有素数. 方法一:试除法 由素数的定义得到如下程序: #include<stdio.h> int print_prime(int num)//prime表示素数 { int i = 0; for (i = 2; i <= num; i++) { int j = 0; for (j = 2; j < i; j++) { if (i%j == 0) { break; } } if (i==j) { printf("

多栈共享技术,双端栈的初始化、进栈、出栈操作

栈的应用非常广泛,经常会出现一个程序中需要同时使用多个栈的情况.若使用顺序栈,会因为对栈空间大小难以准确估计,从而产生有的栈溢出.有的栈空间还很空闲的情况.为了解决这个问题,可以让多个栈共享一个足够大的数组空间,通过利用栈的动态特性来使其存储空间互相补充,这就是多栈的共享技术. 在顺序栈的共享技术中,最常用的是两个栈的共享技术,即双端栈.它主要利用了栈的栈底位置不变,而栈顶位置动态变化的特性. 实现代码如下: #include<iostream> using namespace std; #d