- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章的栈概要
栈的应用 1.数制转换 2.括号匹配 3.表达式处理 4.老鼠闯迷宫 5.其他 2.括号匹配 1.C等编译系统在求解表达式的值时,第一步需要判断表达式里的左括号与右括号是否匹配。判断表达式中的括号是否匹配的最好办法是使用栈。 三类括号[] () { } 2.遇到左括号,进栈;遇到右括号退栈。在表达式分析过程中,在遇到右括号时,栈已空,则表示不匹配,或者当前的括号与栈顶的括号不一致。当表达式处理完了后,栈里还有内容,表示左括号比右括号多。以上都没有发生,则括号匹配。 括号匹配算法 算法3_12 3.表达式求值 中缀表达式:运算符在两个运算数的中间,(a+b)*c/d,就是中缀表达式。 后缀表达式,运算符在两个运算之后,称后缀表达式,也称逆波兰式表达式。 ab+c*d/ 表达式求值过程: 1.先把中缀表达式转换为后缀表达式。 2.再对后缀表达式求值 这两步都要用到栈。 优先级的概念 在表达式求值过程,计算的顺序用优先级表示。先处理的优先级,后处理的优先级低。 优先级要根据数学运算规则得到的。 优先级的规定 把中缀表达式转换后缀表达式 定义一个运算符栈,保存暂时不能处理的运算符。具体过程如下: 1.左到右逐个扫描整个表达式,若当前的运算符比栈顶的运算符优级高,进栈,否则输出栈。 2. 如果左括号,进栈(或压栈)。 3.如果右括号,则出栈,直到遇到左括号为止。 对后缀表达式求值 对后缀表达式的求值,也用到栈。现在要定义一个操作数的栈。 对后置表达式进行扫描,遇到操作数进栈,遇到操作符退栈(退2次,以除为例,第一次退出是除次,第二次被除数),并进行运算,运算结果再进栈。当表达式处理完毕时,就得到值。 实验4:用栈实现表达式值 1.第一步简单情形:假设每个操作数都是个数,只有一位,如下所示: (6+4*3)/2-5 2.用键盘输入以下表达式,这样输入的是一个字符串。 3.先把它转换为后缀表达式, 4.然后对后缀表达式求值。 5.再考虑复杂的情形,不限于个位数的情形。 4.老鼠闯迷宫 有一个迷宫,一个老鼠从入口进来,在迷宫里找出一条出路。 用一个二维数组表示迷宫。1表示障碍,0表示通路。 在某个当前位置: 1.确定当前位置是否存在一个位置可走(除刚进来的位置除外) 2.如果有,先把当前位置保存到栈里,走到下一步。 3.如果没有,则从栈顶退栈,退回到前一步位置。 重得执行2,3,值到 a.找到出口位置为止。 b.找不到出口位置,且栈为空,则表示找不到通路。 4. 输出通路。 顺序队列的基本操作 ①入队时:将新元素插入rear所指的位置,然后将rear加1。 ②出队时:删去front所指的元素,然后将front加1并返回被删元素。? 注意: ①当头尾指针相等时,队列为空。 ②在非空队列里,队头指针始终指向队头元素,尾指针始终指向队尾元素的下一位置。??? 顺序队列基本操作 2、循环队列 为充分利用向量空间,克服假上溢现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。 循环队列示意图 循环队列举例 G F D E H I J 0 7 (2) 循环队列边界条件处理 如何判断是“空”还是“满”。 ??? 解决这个问题的方法至少有三种: 另设一布尔变量以区别队列的空和满; 少用一个元素的空间。约定入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为队满(注意:rear所指的单元始终为空); 使用一个计数器记录队列中元素的总数(即队列长度)。 循环队列的类型定义 #define MAXSIZE 100?? //应根据具体情况定义该值 ? typedef struct {????? //头指针,队非空时指向队头元素?????? ElemType element[MAXSIZE] ?????????? int front;????//尾指针,队非空时指向队尾元素的下一位置???????int rear;????? ???? }SeqQueue; 循环队列的基本运算 1.置队空 ??置循环队列为空, 算法3_21 2. 入队 入队在队尾操作,把新元素添加到队尾。 1。判断队是否满,如果满,返回FALSE。 2。把新元素置队尾位置。 3。除尾向后移动一个位置。 算法3_22 3. 出队 1.除是否满,如满,返回FALSE。 2.取队首元素, 3. 移动队首位置 算法3_23 写一个函数求队列的元素的个数 int QueueNumber(CirQueue *Q) { return ( Q-rear-Q-front +QueueSize)%QueueSize; } 3.取队头元素 DataType QueueFront(CirQue
原创力文档


文档评论(0)