数据结构期末复习(二)

数据结构复习(二)

后缀表达式求值

过程:

  1. 遍历表达式,遇到数字入栈
  2. 遇到操作数,弹出最上面的两个元素,执行操作,操作完后结果再入栈
  3. 一直读完,将最后的结果输出

例子:

32 26 - 5 * 28 4 / +
32-26=6
6*5=30
28/4=7
30+7=37
结果就是37

中缀表达式转后缀表达式

下面规则用来理解转换过程,理解扫描过程栈变化的情况。

中缀表达式a + bc + (d e + f) * g,其转换成后缀表达式则为a b c * + d e * f + g * +。

转换过程需要用到栈,具体过程如下:

1)如果遇到操作数,我们就直接将其输出。

2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。

3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。

4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) "的情况下我们才弹出" ( ",其他情况我们都不会弹出" ( "。

5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。

静态链表

静态链表是用数组来模拟存储空间实现链表的。

分为head链和avail链,head链存储的是具体数据,而avail链存储的是可利用空间。

读一下:

'C'、'B'、'A'

如果要添加数据,就要从可以用空间开始添加,删除的修改avail指针就可以了,不需要把值改掉。

循环队列

//循环队列判空条件:

rear==front;

//循环队列判满条件:

(rear+1)%maxSize == front;

//求循环队列的长度:

(rear-front+maxSize)%maxSize;

//遍历循环队列
for(i=front;i!=rear;i=(i+1)%maxSize)
    

栈、队列和递归单元 - 易错题

判断题

  1. 栈是操作受限的线性表,它只允许在表头插入和删除元素。(x)- 栈只允许在表尾插入和删除元素,所以错。
  2. 只有使用了局部变量的递归过程在转换成非递归过程时,才必须使用栈。 (x) - 是否必须使用栈和局部变量存在与否无关,尾递归形式可以不用栈模拟,而递归过程中函数的调用取地址等操作必须由栈模拟(除尾递归等特殊情况)。

填空题

  1. 有n个数入栈,则出栈的顺序有C(2n,n)-C(2n,n-1)种;卡特兰数的定义:

    h(0)=1,h(1)=1,Catalan数满足递归式:h(n) = h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)

  2. 在双端队列中,元素进入该队列的顺序依次为a,b,c,d,则既不能由输入受限的双端队列得到,又不能由输出受限的双端队列得到的输出序列是dbca;分析:输入受限的双端队列可以看成是一个队列和一个栈的组合,因此如果队列和栈都无法输出的元素在输入受限的双端队列中同样无法输出。而我们知道,栈可以输出的组合个数为C(8,4)-C(8,3) = 14种,队列能输出的组合个数为1种,四个元素排列有A(4,4)=24种,24-14-1=9种,所以两种结构都不能输出的组合数共有9种。只考虑栈不能输出的组合,因为数目小。分别为adbc,bdac,cabd,cadb,dabc,dacb,dbac,dbca,dcab,在这几个序列里面找输出受限的队列不能输出的序列,就很容易找到dbca了。

猜你喜欢

转载自www.cnblogs.com/aoru45/p/10458309.html