首页 > 编程知识 正文

栈的后缀表达式,中缀转后缀表达式算法

时间:2023-05-04 10:36:51 阅读:39815 作者:2112

主题:当前骑马订格式为1(2-3) *4 10/5

请使用堆栈的特性编写程序,使程序输出后缀表达式

分析如下。

步骤1 :

1(2-3) *4 10/5

第一个输入是数字1,数字在后缀表达式中直接输出,后跟符号“”,然后进入堆栈。

步骤2 :

1(2-3) *4 10/5

第三个字符是「()”,保持符号不变,进入堆栈,然后是数字2、输出,然后是符号“-”,进入堆栈。

步骤3 :

1(2-3) *4 10/5

接下来是数字3,输出,紧跟其后的是「()”。 此时,必须与堆栈中的“)”匹配,在匹配前将堆栈顶部的数据按顺序从堆栈中提取出来。 )这类似于在括号中优先执行的道理) )。

步骤4 :

1(2-3) *4 10/5

接着是符号“*”,直接进入堆栈

步骤5 :

1(2-3) *4 10/5

遇到数字4,输出,后跟符号“”。 此时,堆栈顶部的元素为符号“*”,遵循先乘除后加减的原理。 此时,堆栈最上面的乘号的优先顺序比即将进入堆栈的要大,所以将堆栈发出去。

堆栈中的第二个要素是加号,理论上大家都坐得很平,但按照先来后到的原则,堆栈中的加号停留太久了,需要走出堆栈透透气。 (同样,如果堆栈中有其他操作员,也是堆栈。)

最后将刚才的加号放入堆栈中,操作如下图所示。

步骤6 :

1(2-3) *4 10/5

数字10后紧跟输出,最后是符号“/”,进入堆栈:

步骤7 :

1(2-3) *4 10/5

最后一个数字5,输出,所有输入处理都完成了,但是堆栈中还有数据,所以按顺序堆栈堆栈中的符号。

总结规则:

从左向右遍历骑马订格式的各数字和符号,数字的情况下直接输出,符号的情况下判断与栈顶符号的优先级,低于右括号或栈顶符号的优先级的情况下依次栈顶元素输出,直到遇到左括号或栈空

代码实现如下:

# include stdio.h # include stdlib.h # define stack _ init _ size 20 # definestackincrement 10 typedefcharelemtype; 类型结构{ elemtype * base; ElemType *top; int stackSize; }sqStack; init堆栈(sqstack * s ) s-base=) elemtype * (malloc ) stack _ init _ size * sizeof (elemtype ) ); if (! s-base (退出) 0; s-top=s-base; s-stackSize=STACK_INIT_SIZE; )推式(sqstack * s,ElemType e ) /堆栈、添加空间和鱼油都需要知道! if(s-top-s-base=s-stacksize ) s-base=(elemtype* ) realloc ) s-base,(s-stackSize STACKINCREMENT ) )静态s-base (退出) 0; s-top=s-base s-stackSize; s-stack size=s-stacksizestackincrement; }*(s-top )=e; //保管数据的STP; }pop(sqstack*s,ElemType *e ) if ) s-top==s-base )返回; *e=*--(s-top )//弹出堆栈顶部元素以修改堆栈顶部指针(intstacklen (sqstacks ) return ) s.top-s.base ); (}int main ) ) { sqStack s; char c,e; Init堆栈(s; printf ('请输入骑马订公式。 请将#作为结束标志:'); 扫描(' % c ',c ); 威廉(c!='# ' ) while(c='0'c='9' ) printf )、c ); 扫描(' % c ',c ); if(c(0)|c (9) ) { printf ) ); }if () ) (==c ) ) pop ) ) s,e ); while () )!=e () printf )、e ); pop(s,e ); }elseif(''==c||'-'==c ) if (! 堆叠len (s ) ) { Push(s )、c ); }else{do{pop(s,e ); if () () ()==e ) ) push ) s,e ); }else{printf('%c ',e ); } while (堆叠len (s ) ' (!=e; 推送(s,c ); }elseif((* )==c|| )/()=c|) ) )==c ) push ) s,c ); }elseif('#'==c ) { break; } else { printf('n错误:输入格式错误! n '; 返回- 1; }扫描(' % c ',c ); } while (堆叠len ) s ) ) pop ) s,e ); printf('%c ',e ); }返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。