本文实例为大家分享了C++实现中缀表达式转后缀表达式的具体代码,供大家参考,具体内容如下
一、思路:和中缀表达式的计算类似,只不过不用计算,把表达式输出即可
1.用字符数组存储整行输入的中缀表达式;
2.接着从字符数组的0位置开始判断字符,如果是数字,那就要判断后面是否是数字,如果是就不断扫描组成一个整数
(暂不考虑负数和小数),最终组成一个整数,然后输出这个数(因为不用计算,所以直接输出即可);
3.如果是左括号,直接进符号栈;
4.如果是操作运算符,与符号栈的栈顶元素比较优先级:如果高就压入栈;
低,就取出符号栈顶的元素输出;
接着,再判断符号栈顶的元素和当前的运算符号继续比较优先级,重复前面步骤,直到栈空或者当前的符号优先级高;
5.如果是右括号,把符号栈栈顶的元素取出,如果不是左括号,把取出的运算符输出,接着取符号栈栈顶的元素,直到符号栈中取出的符号是左括号;
6.当扫描完字符数组时,判断符号栈是否为空:
不为空,把符号栈栈顶的元素取出,输出到窗口,直到符号栈为空。
二、实现程序:
// 中缀表达式转后缀表达式 // 操作符:+、-、*、/、% // 输入:可以用cin.getline(arr, 250)或者cin.get(ch) && ch != '\n' // 测试数据:输入格式:(注意:不能有中文的操作符) // 2+(3+4)*5 // 16+2*30/4 // 输出格式: // 2 3 4 + 5 * + // 16 2 30 * 4 / + #include#include // 判断是否是操作符 bool isOperator(char ch) { if(ch == '+' || ch == '-' || ch == '*' || ch == '/') return true; return false; // 否则返回false } // 获取优先级 int getPriority(char ch) { int level = 0; // 优先级 switch(ch) { case '(': level = 1; break; case '+': case '-': level = 2; break; case '*': case '/': level = 3; break; default: break; } return level; } int main(int argc, const char * argv[]) { // insert code here... int num; char arr[250]; // 一个一个的读取表达式,直到遇到'\0' std::stack op; // 栈op:存储操作符 while(1) { std::cin.getline(arr,250); int len, i; char c; // c存储从栈中取出的操作符 len = (int)strlen(arr); // strlen()输出的是:unsigned long类型,所以要强制转换为int类型 i = 0; while(i
运行结果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。