栈和队列习题课

69次阅读

共计 2108 个字符,预计需要花费 6 分钟才能阅读完成。

设计一个判别表达式中括号是否配对出现的算法,采用(栈)数据结构最佳。

解析:依次判断表达式中的每个字符,若是左括号就入栈,若是右括号则出栈,出栈的时候判断是否为空,如果为空,则说明不匹配;最后读到表达式末尾没有字符了,再判断一下栈是否为空,如果为空,则说明匹配,不为空,说明不匹配。

若一个栈的输入序列为 1,2,3,…,n,输出序列的第一个元素是 i,则第 j 个(1≤j≤i)输出元素是(不能确定)。

解析:不能确定是一次性全进完、全出完, 只知道进入的序列不变。当一次性弄完时,答案为 i -j+1;当边进边出时,元素难以确定。
修改一下此题目,若一个栈的输入序列为 1,2,3,…..,n,输回出序列的第一个元素是n,则第 i 个输出元素(一定是 n -i+1)。因为暗含的意思就是,从 1 到 n - 1 已经全部入栈,输出的顺序就是从 n 到 1 的唯一顺序,第 i 个输出元素就为 n -i+1

栈在(递归调用、子程序调用、表达式求值)中应用。

解析:栈就是一个先进后出的结构;队列就是一个先进先出的结构。一般只要满足这个特点就可以称之为栈或队列。
栈的应用:非常广泛,一般在计算机中,只要数据的保存满足先进后出的原理,都优先考虑使用栈,是计算机中不可缺的机制。在 CPU 内部就有提供栈这个机制。主要用途:函数调用和返回,数字转字符,表达式求值,走迷宫,子程序调用和返回,中断时数据保存和返回。在编程语言中主要用来进行函数的调用和返回。
队列的应用:队列主要用在和时间有关的地方,特别是操作系统中,队列是实现多任务的重要机制。windows 中的消息机制也是通过队列来实现的。进程调度也是使用队列来实现,所以队列也是一个重要的机制。只要满足数据的先进先出原理就可以使用队列。

向一个顺序栈插入一个元素时,首先把待插入元素写入到这个位置上,然后使栈顶后移一个位置。(错)

解析:插入先判满,弹出先判空。
1、进栈(PUSH)算法
①若 TOP≥n 时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
②置 TOP=TOP+1(栈指针加 bai1,指向进栈地址);
③S(TOP)=X,结束(X 为新进栈的元 du 素);
2、退栈(POP)算法
①若 TOP≤0,则给出下溢信息,作 zhi 出错处理(退栈前先检查是否已为空栈,空则下溢;不空则作②);
②X=S(SOP),(退栈后的元素赋给 X);
③TOP=TOP-1,结束(栈 dao 指针减 1,指向栈顶)。

假设以数组 A[m]存放循环队列的元素, 其头尾指针分别为 front 和 rear,则当前队列中的元素个数为((rear – front + m)% m)

解析:首先注意,rear 指向最后一个元素的下一个元素,所以 rear-front 即可,不需要 +1;其次 + m 是为了避免当 rear 已经转了一圈后,rear 的值小于 front 的值的情况,保证分子大于 0

用链接方式存储的队列,在进行删除运算时(头、尾指针可能都要修改)。

在有头结点的链队列的出队操作中,一般只需修改队头指针;但当原队列中只有一个结点时,该结点既是队头也是队尾,故删去此结点时亦需修改队尾指针,使其指向头结点,且删去此结点后队列变空

在一个循环队列 Q 中,判断队空的条件为 Q.rear+1 == Q.front,队满的条件为(Q.rear+1)%MAXSIZE==Q.front
每次从队列中取出的应是具有最高优先权的元素,这种队列就是优先级队列。

队列是一种特征为 FIFO 的数据结构,每次从队列中取出的是最早加入队列中的元素。但是,许多应用需要另一种队列,每次从队列中取出的应是具有最高优先权的元素,这种队列就是优先级队列 (Priority Queue),也称为优先权队列。
优先级队列是 0 个或多个元素的集合,每个元素都有一个优先权或值。
当给每个元素分配一个数字来标记其优先级时,可设较小的数字具有较高的优先级,这样更方便地在一个集合中访问优先级最高的元素,并对其进行查找和删除操作。
对优先级队列,执行的操作主要有:(1)查找,(2)插入,(3)删除。
在最小优先级队列 (min Priority Queue) 中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素。
在最大优先级队列 (max Priority Queue) 中,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素。
插入操作均只是简单地把一个新的元素加入到队列中

消除递归不一定需要使用栈

不是所有的递归转化为非递归都要用到栈。转化为非递归主要有两种方法:对于尾递归或单向递归,可以用循环结构算法代替;其余的使用栈的方法。例如求阶乘的,是单向递归,直接用循环去替代从 1 乘到 n 就是结果了;斐波那契数列亦然

任何一个递归过程都可以转换成非递归过程
即使对不含相同元素的同一输入序列进行两组不同的合法的入栈和出栈组合操作, 所得的输出序列也一定相同(错)

解释一下题目的意思:对于同一个输入序列(序列中元素各不相同),使用两种不同的入栈和出栈组合操作,所得到的输出序列一定相同。

解析:对于栈来说,由于输入序列中元素各不相同,所以输出序列肯定不同;如果是使用两种不同的(合法)的入队和出队组合操作,则其输出序列一定是相同的。

正文完
 0