对一组数1,2,3……n进行进出栈操作。其进栈的顺序从小到大。问:这样得到的出栈数组有多少种可能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对一组数1,2,3……n进行进出栈操作。其进栈的顺序从小到大。问:这样得到的出栈数组有多少种可能相关的知识,希望对你有一定的参考价值。
(比如对于1,2,3,4,5,6这组数,如果第一次让1,2,3进栈,之后让进了栈的3,2出栈,之后让4,5进栈,再让在栈里的5,4,1出栈,最后让6进栈,在让6出栈。这样得到的出栈数数组为:3,2,5,4,1,6)
只要最后结果,应该是关于N的公式,谢谢
先建立两个数组:a[n];b[n].a[n]代表对一组数1,2,3……n进行进出栈操作,最终全部出栈能得到的出栈数组的种类数;b[n]代表同样是对一组数1,2,3……n进行进出栈操作,但并没有完全出栈能得到的出栈数组的种类数。对于进出栈操作时这样定义的:该过程可以被分为m次进栈和m次出栈(m<=n),而每次进栈数和出栈数不能为0.当然最后一次进展之后必然跟着一次出栈操作。
这样,对于a[n+1],对应的出栈种类数就可以分为n+1大类:
1. 最后一次进栈的是n+1号元素,下分两小类:(1)最后一次进栈时栈里已无被压元素,也就是前n号元素已被清空了。这样最后一次出栈只能把n+1号元素排出去。对应出栈种类数为a[n]。(2)最后一次进栈时栈里还有被压元素,这样最后一次出栈只能把n+1号元素以及剩余元素全部排出去。对应出栈种类数为b[n]。
2. 最后一次进栈的是n,n+1号元素,下分两小类:(1)最后一次进栈时栈里已无被压元素,也就是前n-1号元素已被清空了。这样最后一次出栈只能把n+1,n号元素排出去。对应出栈种类数为a[n-1]。(2)最后一次进栈时栈里还有被压元素,这样最后一次出栈只能把n+1,n号元素以及剩余元素全部排出去。对应出栈种类数为b[n-1]。 参考技术A 你在有关树的计数问题上可以得到答案 参考技术B 1 参考技术C en
入栈和出栈的基本操作
描述
输入一个整数序列a1,a2,a3...,an。当ai不等于-1时将ai进栈;当ai=-1时,输出栈顶元素并将其出栈。
输入
多组数据,每组数据有两行,第一行为序列的长度n,第二行为n个整数,整数之间用空格分隔。当n=0时输入结束。
输出
对于每一组数据输出若干行。每行为相应的出栈元素。当出栈异常时,输出“POP ERROR”并结束本组数据的输出。
输入样例 1
5 1 2 -1 -1 1 5 1 -1 -1 2 2 0
输出样例 1
2 1 1 POP ERROR
最基本的常规栈操作,没啥可说的
#include<iostream> using namespace std; #define MAXSIZE 1000 #define OK 1 #define ERROR -1 typedef struct{ int *base; int *top; int stacksize; }SqStack; int InitStack(SqStack &S){ S.base=new int[MAXSIZE]; if(!S.base) return -2; S.top=S.base; S.stacksize=MAXSIZE; return OK; } int Push(SqStack &S,int e){ if(S.top-S.base==S.stacksize) return ERROR; *S.top++=e; return OK; } int Pop(SqStack &S){ if(S.top==S.base) return ERROR; S.top--; return OK; } int GetTop(SqStack &S){ if(S.top!=S.base) return *(S.top-1); } int main(){ while(1){ int n; cin>>n; SqStack S; if(n==0) return 0; InitStack(S); int a[MAXSIZE]; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<n;i++){ if(a[i]!=-1) Push(S,a[i]); else{ if(S.top!=S.base){ cout<<GetTop(S)<<endl; Pop(S); } else{ cout<<"POP ERROR"<<endl; break; } } } } }
以上是关于对一组数1,2,3……n进行进出栈操作。其进栈的顺序从小到大。问:这样得到的出栈数组有多少种可能的主要内容,如果未能解决你的问题,请参考以下文章