#include"SeqStack.cpp"\n#include<iostream>\n#include<stdlib.h>\n#include<string.h>\n#include<cstdlib>\n#define OperaterSetSize 7\nusing namespace std;\nchar OperaterSet[OperaterSetSize] = {'+', '-', '*', '/', '(', ')', '#'};\n/运算符间的优先关系/\nunsigned char Prior[7][7] = { \n '>', '>', '<', '<', '<', '>', '>',\n '>', '>', '<', '<', '<', '>', '>',\n '>', '>', '>', '>', '<', '>', '>',\n '>', '>', '>', '>', '<', '>', '>',\n '<', '<', '<', '<', '<', '=', ' ',\n '>', '>', '>', '>', ' ', '>', '>',\n '<', '<', '<', '<', '<', ' ', '='\n};\n\n/判断c是否是运算符/\nint IsOperator(char c) {\n int flag = 0;\n for(int i = 0; i < OperaterSetSize; i++) {\n if(c == OperaterSet[i]) {\n flag = 1;\n break;\n }\n }\n return flag;\n}\n\n/返回运算符oper在运算符数组中的序号/\nint ReturnOpOrd(char oper) {\n for(int i = 0; i < OperaterSetSize; i++) {\n if (oper == OperaterSet[i]) {\n return i;\n }\n }\n return -1;\n}\n\n/比较两个运算符的优先级,返回字符>,<,=/\nchar Priority(char c1, char c2) {\n int i,j;\n i = ReturnOpOrd(c1);\n j = ReturnOpOrd(c2);\n return Prior[i][j];\n}\n\n/符号运算函数,只有+,-,,/ /\ndouble Operate(double a, unsigned char c, double b) {\n switch (c) {\n case '+':\n return a + b;\n case '-':\n return a - b;\n case '':\n return a * b;\n case '/':\n return a / b;\n default:\n return 0;\n }\n}\n\n/算术表达式求值的算符优先算法/\nvoid InToPostfix() {\n SeqStack OPTR;\n OPTR.Push('#');\n char c, oper, cton[2];\n char tmp[10];\n float data;\n c = getchar();\n /将tmp置为空/\n strcpy(tmp, "\0");\n while (c != '#' || OPTR.GetTop() != '#') {\n /c是操作数,将操作数用#分隔并输出/\n if(!IsOperator(c)) {\n cton[0] = c;\n cton[1] = '\0'; /存放单个数/\n strcat(tmp, cton); /将单个数连到tmp中,形成字符串/\n c = getchar();\n /如果遇到运算符,则将字符串tmp转换成浮点数,入栈,并重新置空/\n if(IsOperator(c)) {\n data = (float)atof(tmp);\n cout<<data; \n cout<<"#";\n strcpy(tmp, "\0");\n }\n }\n /c是运算符/\n else {\n switch(Priority(OPTR.GetTop(), c)) { \n case '<': /栈顶元素优先权低/\n OPTR.Push(c);\n c = getchar();\n break;\n case '=': /脱括号并接收下一字符/\n OPTR.Pop(); \n c = getchar();\n break;\n case '>': /退栈并输出,继续处理当前字符/\n oper = OPTR.Pop();\n cout<<oper; \n break;\n default:\n break;\n }\n }\n }\n \n}\n\nint main() {\n system("color F0"); \n cout<<"项目实现人:顾文婧"<<endl; \n cout<<"请输入中缀表达式(以'#'结束):"<<endl;\n InToPostfix();\n return 0;\n}\n

C++ 实现算符优先算法:中缀表达式转后缀表达式并求值

原文地址: https://www.cveoy.top/t/topic/qyId 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录