栈的特点,并用日常例子来比拟?
答:栈(stack)中,被删除的是最近插入的元素:栈实现的是一种后进先出(last-in,first-out,LIFO)策略,就如同餐桌上摞起来待清洗的盘子,最后摞在顶端的盘子,会最先放入水槽中被清洗。
如何检测栈是否为空?
答:当S.top=0时栈中不包含任何元素,即栈是空的(empty),利用查询操作STACK-EMPTY。
什么叫栈下溢?
答:如果试图对一个空栈执行弹出操作,则称栈下溢(underflow)。
什么叫栈上溢?
答:如果栈的元素已满,即S.top超过n时,则称栈上溢(overflow)。
伪代码实现空栈检测,栈内压入元素,栈内弹出元素(前提:不考虑栈的上溢问题。)
答:
STACK-EMPTY(S)
1 if S.top==0
2 return TRUE
3 else return FALSE
PUSH(S,x)
1 S.top=S.top+1
2 S[S.top]=x
Pop(S)
1 if STACK-EMPTY(S)
2 error"underflow"
3 else S.top=S.top-1
4 return S[S.top+1]
以上三种栈的执行时间为多少?
三种栈执行的时间都为O(1).
队列的特点,并用一个例子来比拟?
答:队列(queue)具有先进先出的特性类似于收银台前排队结账的一队顾客,队列有对头(head)和队尾(tail),当有一个元素入队时,它被放在队尾的位置,就像一个新来的顾客排在队伍的末端的位置,而出队的元素则总是在队头的那个,就像排在队伍前面等待最久的那个顾客一样。
什么时候队列是满的?
答:Q.head指向队头元素,Q.tail则指向下一个新元素将要插入的位置,当Q.head=Q.tail+1时,队列是满的。
什么时候队列是空的?
答:Q.head指向队头元素,Q.tail则指向下一个新元素将要插入的位置,当Q.head=Q.tail时,队列是空的。
伪代码实现入队(ENQUEUE)和出队(DEQUEUE)操作?
答:
ENQUEUE(Q,x)
1 Q[Q.tail]=x
2 if Q.tail==Q.length
3 Q.tail=1
4 else Q.tail=Q.tail+1
DEQUEUE(Q)
1 x=Q[Q.head]
2 if Q.head=Q.length
3 Q.head =1
4 else Q.head=Q.head+1
5 return x
以上出队和入队的执行时间是多少?
答:出队和入队的操作时间都为O(1).