3.2 给出区分给定的“栈操作”序列是否合法的准则,并证明两个不同的合法序列不可能得到相同的输出元素序列。
准则:
1,从操作序列中第一个自夫妻的任何一个自序列中,‘S’的个数不少于‘X’的个数。
2,整个序列中,‘S’的个数和‘X’的个数相同。
证明:(反证法)
假设两个不同的合法操作序列:
T1 = u1,u2,,,,,un,
T2 = v1,v2,,,,,,vn,
ui,vi €{S,X} i=1,2,,,,,n
可以得到相同的输出元素序列。
不失一般性,假设第一个不同的操作为:uk = ’S‘ ≠vk = 'X'
即:uj = vj,j=1,2,,,,,k-1
则此时,已输出的元素序列相同,栈的状态也相同,且栈中至少存在一个元素。
(为什么是至少存在一个元素呢?因为如果不存在最后一个元素那么下一个是出栈操作就不会合法了)
架设,栈顶的元素为 β,正待输入的元素为 α,
则根据栈的后进先出的原则,
由T1得到的输出序列中,α领先于β,而又T2得到的输出序列中,β 领先于 α。
由此证得,两个不同的合法操作序列不可能得到相同的输出元素序列。
3.6
status test(int& sum){
int x;
scaf(x);
if(!x) sum= 0;
else { test(sum);}
sum+=x;
printf(sum);
}
从上述运行结构可见,输出顺序和输入顺序恰相反。所以我们用栈解决此递归问题。
void ditui(int sum){
InintStack(S); scanf(x);
while(x) {Push(S,x); scanf(x); }
sum = 0; prinf(sum);
while(!StatckEmpty(S)){
sum+=Pop(S);
printf(sum);
}
}
3.8 识别读入的一个反对称的字符序列。
例如:abcd&dcba@ 是反对称字符序列;abc&@ 或 abc& abc@ 或 ab&bac@都不是反对称 字符序列。
三种情况:1,两边字符数量相同;2,一遍多另一边少;3,一遍少,另一边多。
(对栈的考察)