本文主要是介绍中缀表达式转后缀表达式并输出计算结果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
后缀表达式又称逆波兰表达式,明显的特点是:逆波兰表达式中没有括号,计算时将操作符之前的第一个数作为右操作数,第二个数作为左操作数,进行计算,得到的值继续放入逆波兰表达式中。
但日常生活中我们总是习惯于写中缀表达式,所以需要先将中缀表达式转为后缀表达式。
假如中缀表达式为:12*(3+4)-6+8/2
在遇到数字时,我们直接输出,遇到符号,则入栈。但在入栈时,我们要判断栈内已有的操作符的优先级和需要判断的操作符的优先级的大小。
栈内<栈外:入栈操作符
栈内>栈外:出栈操作符
栈内=栈外:出栈 栈内的操作符并入栈 栈外的操作,
遇到 ‘(’:直接入栈
遇到 ‘)’:出栈所有操作符直达遇到 ‘(’
因为第一个操作符进入时也需要比较,所以在创建出保存操作符的栈时,直接就入栈一个’#’,别的字符也行,只要是非操作符就行,并将其优先级设为”1”,其他操作设为更低的”-1”。
优先级:
0–>’#’;
1–>’(‘;
2–>’+’;
2–>’-‘;
3–>’*’;
3–>’/’;
4–>’)’;
其他情况下优先级均为’-1’。但是我们在判断优先级时,因为’(‘的优先级为’1’,比较小,所以判断时要先判断是否为’(‘,是的话直接入栈,我们可以用if,else if,else完成。
具体代码实现如下:
#include <iostream>
#include <stack>
#include <math.h>
using namespace std;bool Number(char ch)//判断是否为数字,是则返回true
{if (ch >= 48 && ch <= 57)return true;elsereturn false;
}void InPut(char*& str)//接收输入的中缀表达式的函数,并简单判断是否合法
{cout << "Please Enter What You Want To calculation:" << endl;while (1){cin >> str;if (Number(str[0]))//中缀表达
这篇关于中缀表达式转后缀表达式并输出计算结果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!