四个元素依次进栈有几种出栈方式,元素出栈顺序怎么做

四个元素依次进栈有几种出栈方法?
先进栈的元素,后出栈.出栈次序由进栈次序决定,故共有4x3X2x1=24种:abcd、abdc、acbd、acdb、adbc、adcb、bacd、badc、bcad、bcda、bdca、bdac、cabd、cadb、cbad、cbda、cdba、cdab、dabc、dacb、dbac、dbca、dcab、dcba
有n+1个元素时,出栈方法为F[n+1]=∑(i=0,i)种。
元素出栈正确的方式?
一、递推
我们把n个元素的出栈个数的记为f(n), 既然如此那,针对1,2,3, 我们比较容易得出:
f(1) = 1 //即 1
f(2) = 2//即 12、21
f(3) = 5 //即 123、132、213、321、231
然后我们来考虑f(4), 我们给4个元素编号为a,b,c,d, 既然如此那,考虑:元素a只可能出现在->1号位置,2号位置,3号位置和4号位置(比较容易理解,一共就4个位置,例如abcd,元素a就在1号位置)。
分析:
1) 假设元素a在1号位置,既然如此那,只可能a进栈,马上出栈,这个时候还剩元素b、c、d等着操作,就是子问题f(3);
2) 假设元素a在2号位置,既然如此那,一定有一个元素比a先出栈,即有f(1)种可能顺序(只可以是b),还剩c、d,即f(2), 按照乘法原理,一共的顺序个数为f(1) * f(2);
3) 假设元素a在3号位置,既然如此那,一定有两个元素比1先出栈,即有f(2)种可能顺序(只可以是b、c),还剩d,即f(1),
按照乘法原理,一共的顺序个数为f(2) * f(1);
4) 假设元素a在4号位置,既然如此那,一定是a先进栈,后出栈,既然如此那,元素b、c、d的出栈顺序即是此小问题的解,即 f(3);
结合全部情况,即f(4) = f(3) + f(2) * f(1) + f(1) * f(2) + f(3);
为了规整化,我们定义f(0) = 1;于是f(4)可以重新写为:
f(4) = f(0)*f(3) + f(1)*f(2) + f(2) * f(1) + f(3)*f(0)
然后我们推广到n,推广思路和n=4时完全一样,于是我们可以得到:
f(n) = f(0)*f(n-1) + f(1)*f(n-2) + ... + f(n-1)*f(0)
即
二、通项(卡特兰数)
C(2n,n)/(n+1)
其实,可以觉得问题是,任意两种操作,要求每种操作的总次数一样,且进行第k次操作2前一定要先进行至少k次操作1。我们假设一个人在原点,操作1是此人沿右上角45°走一个单位(一个单位设为根号2,这样他首次进行操作1就刚好走到(1,1)点),操作2是此人沿右下角45°走一个单位。第k次操作2前一定要先进行至少k次操作1,就是说明所走出来的折线不可以跨越x轴走到y=-1这条线上!在进行n次操作1和n此操作2后,此人必将到到达(2n,0)!若无跨越x轴的限制,折线的种数将为C(2n,n),也就是在2n次操作中选出n次作为操作1的方式数。
abcd出栈顺序的都概率?
有一个公式,可算出多少种情况
1/(n+1) *C(2n,n)
故此,应该有14种情况
ABCD;ACBD;ACDB;ABDC;ADCB;BACD;BADC;BCAD;BCDA;BDCA;CBAD;CBDA;CDBA;DCBA
栈中的数据唯有一种方法出栈,即先进后出,故此,出栈的可能数目跟入栈的可能排列数目是完全一样的。a的出入有2中可能,b的出入有2种可能,c的出入有2种可能,d只关系入,唯有一种可能。故此,可能的出栈方法数为2*2*2*1=8种
入栈顺序:a、b、c、d。出栈顺序可以是:d、c、b、a;a、b、c、d;b、a、c、d不少,但要把栈想像成一个没盖子的纸箱,取出东西时只可以从上层取,放进东西也只可以放在上层,故此,栈是一个“后进先出”或“先进后出”的顺序存储结构。
栈是先进后出的
概率有 dcba
d出c出d入c入的情况是cdba
d出c出b出 cbda cdba dbca dcba bcda bdac等,详细看出栈和入栈的情况
1.创建一个顺序栈,并写出出栈和入栈算法2.创建一个循环(顺序)队列,并写出出队和入队算法。解答答?
这是我用链表结构达到的栈,下面这些内容就是算法,顺序表部分没写,近没什么时候,不好意思啦。
#includestdio.h
#includestdlib.h //涵盖malloc()和realloc()函数的头文件
#includemath.h //涵盖pow()函数的头文件
#define Max_stack_size 20
#define Addersize 10
typedef char Elemtype;
typedef struct{
Elemtype *base;
Elemtype *top;
int stacksize;
}sqStack;
void initStack (sqStack *s){ //初始化一个空栈
s-base=(Elemtype *)malloc(Max_stack_size*sizeof(Elemtype));
if(!s-base) exit(0);
s-top=s-base;
s-stacksize=Max_stack_size;
}
void pushStack(sqStack *s,Elemtype e){ //入栈操作
if(s-top-s-base=s-stacksize)
{s-base=(Elemtype *)realloc(s-base,(s-stacksize+Addersize)*sizeof(Elemtype));
if(!s-base) exit(0);
s-top=s-base+s-stacksize;
s-stacksize=s-stacksize+Addersize;}
*(s-top)=e;
s-top++;
}
void popStack(sqStack *s,Elemtype *e){ //出栈操作
if(s-top==s-base) return;
*e=*-(s-top);
}
void clearStack(sqStack *s) //清空栈
{
s-top=s-base;
}
void destroyStack(sqStack *s){ //处理栈
int i;
int len;
len=s-stacksize;
for(i=0;ilen;i++)
{free(s-base);
s-base++;
}
s-base=NULL;
s-top=s-base;
s-stacksize=0;
}
int counterStack(sqStack s)
{return (s.top-s.base);}
void main()
{ sqStack p;
Elemtype c;
int i,sum,length;
sum=0;
printf("initial:\");
initStack(p);
printf("push the 8 scale:\");
scanf("%c",c); //输入数据时不可以隔开,不然答案错误,空格也算字符
while(c!='#')
{pushStack(p,c);
scanf("%c",c);
}getchar();
length=counterStack(p); //有错时更容易检测到。
printf("numbers'length:%d\",length);
for(i=0;ilength;i++)
{popStack(p,c);
{sum=sum+(c-48)*pow(8,i);} //二进制pow(8,i)改成pow(2,i),十六进制用if else如/**/中所示
}
/* if('0'c'9') {sum=sum+(c-48)*pow(16,i);}
else if('A'c'Z') {sum=sum+(c-55)*pow(16,i);}
else if('a'c'z') {sum=sum+(c-87)*pow(16,i);}*/
printf("the answer is:%d\",sum);
}