其中遇到了很多问题,贴一下代码吧!
/* 中缀表达式转化规则: 从左到右遍历中缀表达式的每个数字和符号, 若是数字就输出,即成为后缀表达式的一部分; 若是符号,则判断其与栈顶符号的优先级, 是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出, 并将当前符号进栈,一直到最终输出后缀表达式为止。 */ #include <iostream> #include <stack> #include <stdio.h> using namespace std; int prior(char c) //数字越大,表示优先级越高; { if(c == ‘#‘) return 1; if(c == ‘(‘) return 2; //if(c == ‘)‘ || c == ‘(‘) // return 2; if(c == ‘+‘ || c == ‘-‘) return 3; if(c == ‘*‘ || c == ‘/‘) return 4; } int main() { char c; stack <char> op; op.push(‘#‘); //这样做可以方便后面的处理,不然对于判空时不是很好处理; while(scanf("%c",&c),c) { if(c >= ‘a‘&& c <= ‘z‘) cout << c; else if(c == ‘)‘) { while(op.top() != ‘(‘) { cout << op.top(); op.pop(); } op.pop(); } else if(c == ‘(‘) op.push(c); else if(c == ‘#‘) //遇到‘#‘后将栈中的元素全部输出; { while(op.top() != ‘#‘) { cout << op.top(); op.pop(); } return 0; } else { while(prior(c) <= prior(op.top())) //若优先级低于栈顶符号,则栈顶元素出栈;反之,则入栈; { cout << op.top(); //首先输出栈顶元素,然后再弹出; op.pop(); } op.push(c); } } return 0; } //从这个程序中遇到了很多问题,比如结束,如果是判断栈空,怎么解决不是因为刚刚开始就是空的,然后就结束呢? //然后想到的方法就是先将‘#‘压入堆栈中,最后判断栈顶元素是不是‘#‘即可,最后再return 0,这样也让程序退出了,不会陷入死循环。 //还有就是对于括号的处理,调试了很多次,最后终于AC了,心情无比喜悦了!
本文出自 “我的算法笔记” 博客,谢绝转载!
中缀表达式到后缀表达式之间的转化,布布扣,bubuko.com
原文:http://liu168ad.blog.51cto.com/7511123/1391060