正在加载图片...
Q1>Q2Q1的优先级高于Q2 “#”号表示表达式的开始与结東 该表可以采用二维表表示,由先后两算符的序号做下标定位两者的优先 级,如“*”的序号为2,“+”的序号为1,则“*”与“+”相遇OP[2,1] 得到“>”所以“*”的优先级高 [程序实现] (1)算法思想 为了实现算符优先算法,可以使用两个工作栈,一个是操作数栈OPDS, 另一个是运算符栈oPS,分别存放操作数与算符。首先将标志“#”进运算 符栈OPS的底,按照栈后进先出的原则进行: 遇到操作数,进操作数栈,计算机继续扫描下一符号 遇到运算符时,需要将此算符的优先级与OPS栈顶算符优先级比 若优先级比站顶元素高,则进OPS栈,继续扫描下一符号 若优先级比站顶元素低,则运算符优先级比站顶元素OPS栈顶 元素退栈形成一个操作码Q:同时,操作数栈OPS两次退栈 形成两个操作数a,b.计算机对操作数与操作码完成一次运算 操作,即aQb.其运算结果存放在操作数OPDS栈,作为一次运 算的中间结果进OPDS栈。 ≯若与栈OPS栈顶元素优先级相等,则栈顶元素退栈。当遇到栈 顶元素是“#”时,表示整个运算结果,否则,继续扫描下一 个符号 (2)程序实现 /*初始化* ALsE O #define true 1 #define max 10 #include <stdio. h> #include <stdlib. h> void push opds (: / *push opds stack. * float pop opds(: /=pop opds stack. * void push ops o: /=push ops stack. * float pop ops o: /pop ops stack. * char relation(:/*>,<,=*/ float operate: /*+ - *, /* float opds [MAX int ops [MAX /* operator’ s stack*/ int topd=OQ1>Q2 Q1 的优先级高于 Q2 “#”号表示表达式的开始与结束。 该表可以采用二维表表示,由先后两算符的序号做下标定位两者的优先 级,如“*”的序号为 2,“+”的序号为 1,则“*”与“+”相遇 OP[2,1] 得到“>”所以“*”的优先级高。 [程序实现] (1) 算法思想 为了实现算符优先算法,可以使用两个工作栈,一个是操作数栈 OPDS, 另一个是运算符栈 OPS,分别存放操作数与算符。首先将标志“#”进运算 符栈 OPS 的底,按照栈后进先出的原则进行: ◆ 遇到操作数,进操作数栈,计算机继续扫描下一符号; ◆ 遇到运算符时,需要将此算符的优先级与 OPS 栈顶算符优先级比 较。 ➢ 若优先级比站顶元素高,则进 OPS 栈,继续扫描下一符号; ➢ 若优先级比站顶元素低,则运算符优先级比站顶元素 OPS 栈顶 元素退栈形成一个操作码 Q;同时,操作数栈 OPDS 两次退栈, 形成两个操作数 a,b.计算机对操作数与操作码完成一次运算 操作,即 aQb.其运算结果存放在操作数 OPDS 栈,作为一次运 算的中间结果进 OPDS 栈。 ➢ 若与栈 OPS 栈顶元素优先级相等,则栈顶元素退栈。当遇到栈 顶元素是“#”时,表示整个运算结果,否则,继续扫描下一 个符号。 (2) 程序实现 /* 初始化*/ #define FALSE 0 #define TRUE 1 #define MAX 10 #include <stdio.h> #include <stdlib.h> void push_opds(); /*push opds stack.*/ float pop_opds(); /*pop opds stack.*/ void push_ops(); /*push ops stack.*/ float pop_ops(); /*pop ops stack.*/ char relation(); /*>,<,=*/ float operate(); /*+,-,*,/*/ float opds[MAX]; /*operand's stack */ int ops[MAX]; /*operator's stack */ int topd=0; /*opds's top*/
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有