介绍
这篇文章主要讲解了c++实现中缀表达式转后缀表达式的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
<强>一、思路:>强和中缀表达式的计算类似,只不过不用计算,把表达式输出即可
1。用字符数组存储整行输入的中缀表达式;
2。接着从字符数组的0位置开始判断字符,如果是数字,那就要判断后面是否是数字,如果是就不断扫描组成一个整数
(暂不考虑负数和小数),最终组成一个整数,然后输出这个数(因为不用计算,所以直接输出即可);
3。如果是左括号,直接进符号栈;
4。如果是操作运算符,与符号栈的栈顶元素比较优先级:如果高就压入栈;
低,就取出符号栈顶的元素输出;
接着,再判断符号栈顶的元素和当前的运算符号继续比较优先级,重复前面步骤,直到栈空或者当前的符号优先级高;
5。如果是右括号,把符号栈栈顶的元素取出,如果不是左括号,把取出的运算符输出,接着取符号栈栈顶的元素,直到符号栈中取出的符号是左括号;
6。当扫描完字符数组时,判断符号栈是否为空:
不为空,把符号栈栈顶的元素取出,输出到窗口,直到符号栈为空只
<强>二,实现程序:强>
//中缀表达式转后缀表达式//操作符:+、-、*、/?//输入:可以用cin。getline(加勒比海盗,250)或者cin.get (ch)和,ch !=& # 39; \ n # 39;//测试数据:输入格式:(注意:不能有中文的操作符)//2 + (3 + 4)* 5//16 + 2 * 30/4//输出格式://2 3 4 + 5 * +//16 2 30 * 4/+ # include & lt; iostream> # include & lt; stack>//判断是否是操作符 bool isOperator (char ch) { 如果(ch==& # 39; + & # 39;| | ch==& # 39; & # 39;| | ch==& # 39; * & # 39;| | ch==& # 39;/& # 39; 返回true; 返回错误;//否则返回错误的 }//获取优先级 int getPriority (char ch) { int水平=0;//优先级 开关(ch) { & # 39;(& # 39;: 水平=1; 打破; & # 39;+ & # 39; & # 39;& # 39;: 水平=2; 打破; & # 39;* & # 39;: & # 39;/& # 39;: 水平=3; 打破; 默认值: 打破; } 回报水平; } int主要(int命令行参数个数,const char * argv []) {//插入代码… int num; arr char [250];//一个一个的读取表达式,直到遇到& # 39;\ 0 & # 39; std:: stack人事处;//栈op:存储操作符 而(1){ std:: cin.getline(加勒比海盗,250); int len,我; 字符c;//c存储从栈中取出的操作符 len=(int) strlen (arr);//strlen()输出的是:无符号长类型,所以要强制转换为int类型 我=0; 虽然(我& lt;len) { 如果(isdigit (arr[我])){//如果是数字 num=0; {做 num=num * 10 + (arr[我]- & # 39;0 & # 39;);//ch - 48根据ASCAII码,字符与数字之间的转换关系 我+ +;//下一个字符 },(isdigit (arr[我])); std:: cout & lt; & lt;num & lt; & lt;“;“; }else if (arr[我]==& # 39;(& # 39;){//(:左括号 op.push (arr[我]); 我+ +; [我]}else if (isOperator (arr)){//操作符 如果(op.empty()){//如果栈空,直接压入栈 op.push (arr[我]); 我+ +; } 其他{//比较栈op顶的操作符与ch的优先级//如果ch的优先级高,则直接压入栈//否,则推出栈中的操作符,直到操作符小于ch的优先级,或者遇到(,或者栈已空 而(! op.empty ()) { c=op.top (); 如果(getPriority (arr[我])& lt;=getPriority (c)) {//优先级低或等于 std:: cout & lt; & lt;c & lt; & lt;“;“; op.pop (); }//其他ch优先级高于栈中操作符 打破; }//而结束 op.push (arr[我]);//防止不断的推出操作符,最后空栈了,或者ch优先级高了 我+ +; }//其他 }else if (arr[我]==& # 39;)& # 39;){//如果是右括号,一直推出栈中操作符,直到遇到左括号( 而(op.top () !=& # 39; (& # 39;) { std:: cout & lt; & lt;op.top () & lt; & lt;“;“; op.pop (); } op.pop ();//把左括号(推出栈 我+ +; }//其他如果是空白符,就进行下一个字符的处理 我+ +; }//第二个同时结束 而(! op.empty()){//当栈不空,继续输出操作符 std:: cout & lt; & lt;op.top () & lt; & lt;“;“; op.pop (); } std:: cout & lt; & lt;std:: endl; 冲洗(std:: cout); }//第一个而结束 返回0; }
运行结果: