c++ 表达式计算--中缀转后缀再计算

来源:互联网 发布:男士去角质 知乎 编辑:程序博客网 时间:2024/06/05 13:23

考试的时候,考到了表达式优化和计算,所以在网上找了一个代码

代码是花了一个积分下载的,运行过没有问题,先记下来留着以后学习。。。

用两个数组,一个存后缀表达式(stackofEP),一个用来存操作符(stackofID)

遍历表达式,遇到数字直接压表达式栈,遇到符号先存入stackofID,当遇到高优先的操作符时,将符号从stackofID中压入stackofEP

得到后缀表达式EP后,遇到数据就先存入number中,遇到操作符就从number中出栈两个数用操作符计算,然后将结果存入number数组中

思想大致如此,但是感觉代码挺多的

#include<iostream> #include<ctype.h> #include <stdlib.h> #include <iostream>//中缀表达式转后缀表达式 #include <cstring>//通过使用栈暂存运算符,实现运算符位置的调整 #include <string>//tips: 中缀表达式即常见的表达式,可以用二叉树表示。对该二叉 #include <cctype>//树进行后序遍历可以得到后缀表达式(逆波兰表达式)。 #include <stack>using namespace std;#define maxSize 120char buffer[maxSize];//表达式的最长长度char strToken[maxSize];typedef struct line{unsigned short id;short indexOfTable;};struct line data[maxSize];int intTable[maxSize];short flagOfIntTable = 0;short flagOfStruct = 0;struct line stackOfEP[maxSize];//存储后缀表达式short stackOfID[maxSize];//存放符号short countOfEP = 0;short countOfID = 0;const  short INTEGER = 1;const short LEFT_B = 3;const short RIGHT_B = 4;const short PLUS =  6;const short MINUX = 7;const short MULTIPLY = 9;const short DIVIDE = 10;void deleBlank(const char* str){//将字符串空格清除char *temp = buffer;if(0 == *str){*temp = '\0';}while(*str){if(*str ==' '){str++;continue;}*temp++ = *str++; }*temp = '\0';}void init(char *str){for(short i = 0;i <=strlen(str);i++){*str = 0;}}void wordAnalyse(const char* str){const char *start = str;//字符开始指针const char *search;//搜索指针char *temp;while(*start){search = start;temp = strToken;//循环一次,temp指针重新纠正为指向strToken首地址。if(isdigit(*search) != 0){//是数字的时候返回值是4while(isdigit(*search) != 0){*temp++ = *search++;}*temp = '\0';intTable[flagOfIntTable] = atoi(strToken);//转换字符串成int型,atof();itoa(int value,char*s1,int radix)data[flagOfStruct].id = INTEGER;data[flagOfStruct].indexOfTable = flagOfIntTable;init(strToken);//重新初始化flagOfStruct++;flagOfIntTable++;start = search;}else if(*start == '+'){data[flagOfStruct].id = PLUS;data[flagOfStruct].indexOfTable = -1;flagOfStruct++;start++;}else if(*start == '-'){data[flagOfStruct].id = MINUX;data[flagOfStruct].indexOfTable = -1;flagOfStruct++;start++;}else if (*start == '*'){data[flagOfStruct].id = MULTIPLY;data[flagOfStruct].indexOfTable = -1;flagOfStruct++;start++;}else if (*start == '/'){data[flagOfStruct].id = DIVIDE;data[flagOfStruct].indexOfTable = -1;flagOfStruct++;start++;}else if (*start == '('){data[flagOfStruct].id = LEFT_B;data[flagOfStruct].indexOfTable = -1;flagOfStruct++;start++;}else if (*start == ')'){data[flagOfStruct].id = RIGHT_B;data[flagOfStruct].indexOfTable = -1;flagOfStruct++;start++;}else{ start++; }}}void traverse(){//将中缀表达式转化成后缀表达式for (int i = 0; i <flagOfStruct; i++){if (data[i].id == INTEGER){stackOfEP[countOfEP++] = data[i];//如果是数字,直接压入后缀表达式。}else if (data[i].id >= PLUS&&data[i].id <= DIVIDE){//如果是运算符号while (true){if (countOfID == 0){stackOfID[countOfID++] = data[i].id;break;}else if (data[i].id - stackOfID[countOfID] >= 2){stackOfID[countOfID++] = data[i].id;//入栈break;}else{stackOfEP[countOfEP].id = stackOfID[--countOfID];//出栈stackOfEP[countOfEP].indexOfTable = -1;countOfEP++;}}}else if (data[i].id == LEFT_B){//stackOfID[countOfID++] = data[i].id;}else if (data[i].id == RIGHT_B){while (true){//直到有左括号,则弹出循环if (stackOfID[countOfID - 1] == LEFT_B){//必须减一,不然逻辑错误。countOfID--;//出栈break;}if (countOfID == 0){break;}stackOfEP[countOfEP].id = stackOfID[--countOfID];stackOfEP[countOfEP].indexOfTable = -1;countOfEP++;}}}//数据输入结束时,释放所有符号栈的内容,并添加到后缀式while (countOfID){stackOfEP[countOfEP].id = stackOfID[--countOfID];stackOfEP[countOfEP].indexOfTable = -1;countOfEP++;}}//计算后缀表达式int compute(){short tempPtr = 0;int number[120];for (int i = 0; i <countOfEP; i++){if (stackOfEP[i].id == INTEGER){number[tempPtr++] = intTable[stackOfEP[i].indexOfTable];}else if (stackOfEP[i].id == PLUS){int a = number[--tempPtr];int b = number[--tempPtr];number[tempPtr++] = b + a;}else if (stackOfEP[i].id == MINUX){int a = number[--tempPtr];int b = number[--tempPtr];number[tempPtr++] = b - a;}else if (stackOfEP[i].id == MULTIPLY){int a = number[--tempPtr];int b = number[--tempPtr];number[tempPtr++] = b * a;}else if (stackOfEP[i].id == DIVIDE){int a = number[--tempPtr];int b = number[--tempPtr];number[tempPtr++] = b / a;}}return *number;}void display(){for (int i = 0; i <flagOfStruct; i++){if (data[i].id == INTEGER){ printf("%d", intTable[data[i].indexOfTable]); }else if (data[i].id == PLUS){ printf("+"); }else if (data[i].id == MINUX){ printf("-"); }else if (data[i].id == MULTIPLY){ printf("*"); }else if (data[i].id == DIVIDE){ printf("/"); }else if (data[i].id == LEFT_B){ printf("("); }else if (data[i].id == RIGHT_B){ printf(")"); }else{ printf("\n"); }}}void displayEP(){for (int i = 0; i <countOfEP; i++){if (stackOfEP[i].id == INTEGER){ printf("%d", intTable[stackOfEP[i].indexOfTable]); }else if (stackOfEP[i].id == PLUS){ printf("+"); }else if (stackOfEP[i].id == MINUX){ printf("-"); }else if (stackOfEP[i].id == MULTIPLY){ printf("*"); }else if (stackOfEP[i].id == DIVIDE){ printf("/"); }else if (stackOfEP[i].id == LEFT_B){ printf("("); }else if (data[i].id == RIGHT_B){ printf(")"); }else{ printf("\n"); }}}int main(){//test wordAnalytse()//buffer[maxSize]cin >> buffer;deleBlank(buffer);//printf(buffer);wordAnalyse(buffer);traverse();displayEP();printf("\n");printf("%d\n", compute());return 0;}

0 0
原创粉丝点击