123456出栈的可能性有多少种,一个栈的输入序列是12345则栈的输出序列有哪几种
来源:整理 编辑:亚灵电子网 2023-08-02 07:55:26
1,一个栈的输入序列是12345则栈的输出序列有哪几种
序列个数太多,以123为例:123进栈,出栈321;1进栈,1出栈,2进栈,2出栈,3进栈,3出栈,所以是123,以此类推。则(n,m)的排列问题可以转化为(n,m-1)+(n-1,m+1)此时m>=1, 因为必须栈中有元素才可以出栈当m=0则(n,0)的问题只能转化为(n-1,1)当问题为(0, m)时得到递归边界,这个问题的解是只有一种排列最终推导的结果是:P2n = C(n 2n)— C(n+1 2n)=C(n 2n)/(n+1)这个结果是一个“卡塔兰数”Catalan,在组合数学中有介绍,可以参阅有关资料结果=C(5,10)/6= 42扩展资料:1、进栈(PUSH)算法①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);②置TOP=TOP+1(栈指针加1,指向进栈地址);③S(TOP)=X,结束(X为新进栈的元素);2、退栈(POP)算法①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);②X=S(TOP),(退栈后的元素赋给X):③TOP=TOP-1,结束(栈指针减1,指向栈顶)。参考资料来源:百度百科-栈

2,入栈顺序是1234出栈序列有哪几种
4个元素的全排列共有24种,栈要求符合后进先出,按此衡量排除后即得:1234√,1243√,1324√,1342√,1423×,1432√,2134√,2143√,2314√ ,2341√,2413×,2431√,3124×,3142×,3214√,3241√,3412×,3421√,4123×,4132×,4213×,4231×,4312×,4321√。14种可能,10种不可能。扩展资料栈的典型应用有算术表达式的检查和背包问题等,实际上,凡属符合后进先出原则的问题,都可以用栈来处理。1、算术表达式中括号作用域合法性的检查括号作用域的检查是栈的典型实例。检查一个算术表达式中使用的括号是否正确,应从下面两个方面考虑:1)左右括号的数目应该相等;2)每一个左括号都一定有一个右括号与之匹配。算法思想:括号作用域检查的原则是,对表达式从左到右扫描。当遇到左括号时,左括号入栈;当遇到右括号时,首先将栈顶元素弹出栈,再比较弹出元素是否与右括号匹配,若匹配,则操作继续;否则,查出错误,并停止操作。2、背包问题问题:假设有n件质量分配为w1,w2,...,wn的物品和一个最多能装载总质量为T的背包,能否从这n件物品中选择若干件物品装入背包,使得被选物品的总质量恰好等于背包所能装载的最大质量,即wi1+wi2+...+wik=T。若能,则背包问题有解,否则无解。算法思想:首先将n件物品排成一列,依次选取;若装入某件物品后,背包内物品的总质量不超过背包最大装载质量时,则装入(进栈);否则放弃这件物品的选择,选择下一件物品试探,直至装入的物品总和正好是背包的最大转载质量为止。这时我们称背包装满。若装入若干物品的背包没有满,而且又无其他物品可以选入背包,说明已装入背包的物品中有不合格者,需从背包中取出最后装入的物品(退栈),然后在未装入的物品中挑选,重复此过程,直至装满背包(有解),或无物品可选(无解)为止。具体实现:设用数组weight[1..N],stack[1,N]分别存放物品重量和已经装入背包(栈)的物品序号,MaxW表示背包的最大装载量。每进栈一个物品,就从MaxW中减去该物品的质量,设i为待选物品序号。若MaxW-weight[i]>=0,则该物品可选;若MaxW-weight[i] < 0,则该物品不可选,且若i>n,则需退栈,若此时栈空,则说明无解。参考资料来源:百度百科-进栈

3,若让元素12345依次进栈则出栈的可能性有哪些
#include <stdio.h>#include <stdlib.h>#define ELEMENT_TYPE int/* 打印所有可能的出栈顺序 参数: queue 已知的入栈顺序 queue_size 栈 queue 的大小 递归使用参数: poped_queue 出栈顺序。poped_queue[i]=j 表示元素 queue[j] 第 i 个出栈。可以初始为 NULL。 poped_queue_size poped_queue 栈的大小。必须初始为 0 。 total 统计出栈顺序总数。可以初始为 NULL。或者初始为一个变量的地址,该变量的值必须为 0。 */ void printAllPopOrder(ELEMENT_TYPE queue[],int queue_size, int poped_queue[],int poped_queue_size,int *total) int i,j,max_index,top_index; // 分配临时空间 if(poped_queue == NULL) poped_queue = (int*)malloc(sizeof(int)*queue_size); if(poped_queue_size == queue_size) // 全部元素已经出栈,打印出栈顺序 for(i=0;i<poped_queue_size;i++) printf("%d ",queue[poped_queue[i]]); printf("\n"); if(total) (*total)++; } else // 枚举元素 queue[i] 是否能出栈 for(i=0;i<queue_size;i++) // 根据当前的出栈顺序 poped_queue,判断出已经入栈元素的最大索引。 for(j=0,max_index=-1;j<poped_queue_size;j++) if(max_index < poped_queue[j]) max_index = poped_queue[j]; // 根据当前的出栈顺序 poped_queue,找出当前入栈栈顶元素索引。 for(top_index=max_index-1;top_index>=0;top_index--) for(j=0;j<poped_queue_size;j++) if(top_index == poped_queue[j]) break; if(j == poped_queue_size) break; } // 判断元素 queue[i] 能否出栈 if( i>max_index || i==top_index) poped_queue[poped_queue_size] = i; printAllPopOrder(queue,queue_size,poped_queue,poped_queue_size+1,total); } } }}/* "所有可能出栈的顺序总数" ,其实是一个卡特兰数(CatalanNumber)。 设栈的元素数目为 n , 那么"所有可能出栈的顺序总数"为: 2n!/(n+1)/n! 也就是第 n 个卡特兰数。 参数: n 卡特兰数的编号(从1开始) 返回: 第 n 个卡特兰数 */int getCatalanNumber (int n) int total = 1,i; for(i=2*n;i>=(n+2);i--) total *= i; for(i=1;i<=n;i++) total /= i; return total;}int main(int argc, char *argv[]) // 列出元素进栈顺序 ELEMENT_TYPE queue[]= int queue_size = sizeof(queue)/sizeof(queue[0]); int total_1=0,toatl_2=0; // 输出所有可能的出栈顺序 printAllPopOrder(queue,queue_size,NULL,0,&total_1); printf("total = %d\n",total_1); // 调用 printAllPopOrder 其实已经通过变量 total_1 得到了出栈顺序的总数。 // 下面用公式(卡特兰数)计算所有可能出栈顺序的总数。 toatl_2 = getCatalanNumber(queue_size); printf("total = %d\n",toatl_2); return 0;}/*1 2 3 4 51 2 3 5 41 2 4 3 51 2 4 5 31 2 5 4 31 3 2 4 51 3 2 5 41 3 4 2 51 3 4 5 21 3 5 4 21 4 3 2 51 4 3 5 21 4 5 3 21 5 4 3 22 1 3 4 52 1 3 5 42 1 4 3 52 1 4 5 32 1 5 4 32 3 1 4 52 3 1 5 42 3 4 1 52 3 4 5 12 3 5 4 12 4 3 1 52 4 3 5 12 4 5 3 12 5 4 3 13 2 1 4 53 2 1 5 43 2 4 1 53 2 4 5 13 2 5 4 13 4 2 1 53 4 2 5 13 4 5 2 13 5 4 2 14 3 2 1 54 3 2 5 14 3 5 2 14 5 3 2 15 4 3 2 1total = 42total = 42ps; "@找个名字真难呐" 列出了34个,少了8个,它们是:1245313425134521354214352145322135421453*/

文章TAG:
123456出栈的可能性有多少种123456 出栈 可能