
如何判断出栈序列的合法性?
可以提供一个思路,因为是栈,所以后入先出,也就是一个数的后面不会有比它更大的数,比如说 3 2 1 4这样的序列就是非法的,所以只需要挨个排查每一个数,看看它后面有没有比自身更大的数就行了,如果有,就是非法的
关于“栈”的问题~
兄弟,这些题不难
先说第一个。
我们知道栈的原则是先进后出,进栈序列为el,e2,e3,e4,不是说一次性进入的,而是先进了el,e2,这时候出栈的话一定出e2,然后e3,e4又进栈,这时候出栈顺序就是e4,e3,el 了,那么总的出栈顺序就是e2,e4,e3,el 了。
第二个也简单。
A)fun(int y,double m); 是错的,调用函数时不能写上int和double;B)k=fun(10,12.5); 是错的,既然定义了函数是void,也就是无返回,就不可能将返回值赋给k;D)void fun(n,x); 是错的,去掉void。
再回答第三个;void fun(char *a, char *b) ??{ a=b; (*a)++; } ??main() ??{ char c1='A',c2='a',*p1,*p2; ??p1=&c1; p2=&c2; fun(p1,p2); ??printf(%c%c\\\ ,c1,c2); ??} 主函数中,p1指向了变量c1,p2指向了变量c2,fun函数的功能是将指针b的内容赋给指针a,也就是说a和b都指向了同一个变量,然后(*a)++将所指向的变量值加1;将p1,p2传入函数后,p1也指向了p2指向的变量c2,然后将变量c2的值加1,也就是‘a’加1,成为‘b’,而变量c1值不变,所以输出了Ab;再看这个题:{ char str[][20]={Hello,Beijing},*p=str; ??printf(%d\\\ ,strlen(p+20)); ??} 首先,你可能写错了一个地方,在vc上你贴的程序通不过编译,如果改成},*p=str[0],就对了,答案是C。
原因是:虽然hello和Beijing长度不到20,但是str的每一行仍然有20个字符空间,这两行在内存中实际上是一行排列的,p开始时指向字符H,那么p+20就指向了‘B’,由于strlen函数从‘B'开始计算字符数,一直计算到空格符位置,所以字符串Beijing恰好有7个字符。
(字符串最后一个空格符不算是字符,只是结束标志)第9题输出结果是: 1 3 2,很简单的再看你补充的21题,这个程序我无法运行,因为tune函数没有定义
另外,你要注意大小写的区别
最后一个题:class A { int num; public: A(int i){num=i;} A(A &a){num=a. num++;} void print(){cout< 所以A b(a);的作用是将对象a赋给新的对象b,同时a.num=a.num+1,所以a.num=2,b.num=1写了这么多,累死我了,给点分吧 他是以从大到小的随机顺序入栈,虽然顺序不可控,但是从大到小所以5肯定在6后面入栈,遵循后进先出原则,所以5不可能在6之后出栈,所以一眼看出c是不合法的 如果进栈的顺序是a,b,c,d。 问题1:那么出栈的顺序有没有可能是a,b,c,d答:可能 a进->a出->b进->b出->c进->c出->d进->d出(一个数据进栈后不用等其它元素出栈就可以出栈)问题2:出栈的顺序有好多种答:正确。 N个数据进栈有(C(2n,n)\\\/(n+1) [C(n,m)表示n选m的组合数].)种出栈方案。 具体分析如下:对于每一个数来说,必须进栈一次、出栈一次。 我们把进栈设为状态‘1’,出栈设为状态‘0’。 n个数的所有状态对应n个1和n个0组成的2n位二进制数。 由于等待入栈的操作数按照1¨n的顺序排列、入栈的操作数b出栈的操作数a(a≤b),因此输出序列的总数目=由左而右扫描由n个1和n个0组成的2n位二进制数,1的累计数不小于0的累计数的方案种数。 在2n位二进制数中填入n个1的方案数为c(2n,n),不填1的其余n位自动填0。 从中减去不符合要求(由左而右扫描,0的累计数大于1的累计数)的方案数即为所求。 不符合要求的数的特征是由左而右扫描时,必然在某一奇数位2m+1位上首先出现m+1个0的累计数和m个1的累计数,此后的2(n-m)-1位上有n-m个 1和n-m-1个0。 如若把后面这2(n-m)-1位上的0和1互换,使之成为n-m个0和n-m-1个1,结果得1个由n+1个0和n-1个1组成的2n位数,即一个不合要求的数对应于一个由n+1个0和n-1个1组成的排列。 反过来,任何一个由n+1个0和n-1个1组成的2n位二进制数,由于0的个数多2个,2n为偶数,故必在某一个奇数位上出现0的累计数超过1的累计数。 同样在后面部分0和1互换,使之成为由n个0和n个1组成的2n位数,即n+1个0和n-1个1组成的2n位数必对应一个不符合要求的数。 因而不合要求的2n位数与n+1个0,n-1个1组成的排列一一对应。 显然,不符合要求的方案数为c(2n,n+1)。 由此得出 输出序列的总数目=c(2n,n)-c(2n,n+1)=1\\\/(n+1)*c(2n,n)如何判断出栈序列的合法性?如入栈序列1234,一个非法出栈序列是4312,求具体算法,有C++代码更好
进出栈的顺序



