数据结构试题(栈和队列)

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,一遍少,另一边多。

(对栈的考察)

原文地址:https://www.cnblogs.com/yuys/p/3007607.html