实现代码如下
#include <iostream> #include <stack> #include <ctype.h> using namespace std; //这里的数字只能是一位 //扫描表达式是否合法,合法返回0,否则返回非0 int Scanner(const char *str) { stack<char*> s; if(str==NULL) { return -1; } char *p=(char*)str; while(*p!='\0') { if(*p=='(')//如果是左括号就入栈 { s.push(p); } else if(*p==')')//右括号就获得栈顶符号,并匹配 { if(!s.empty())//栈不为空 { char *t=s.top();//拿到栈顶元素进行匹配 if(*t=='(')//匹配 { s.pop(); } } } p++; } if(!s.empty())//最后栈为空匹配失败 { return -1; } return 0; } //返回运算符号的优先级 int GetPriority(char ch) { if(ch=='+'||ch=='-') { return 1; } else if(ch=='*'||ch== '/') { return 2; } else { return 0; } } //中缀表达式转换为后缀表达式 int Transform(/*in*/char *src,/*out*/char *dest) { stack<char*> s; int i=0; if(src==NULL||dest==NULL) { return -1; } char *psrc=src; while(*psrc!='\0') { //if(*psrc>='0'&& *psrc<='9')//如果是数字 if(isdigit(*psrc))//如果字符是数字时 { dest[i]=*psrc; i++; } else if(*psrc=='(')//如果是左括号就进栈 { s.push(psrc); } else if(*psrc==')')//如果是右括号,弹出栈顶元素 { while(!s.empty()&&(*s.top())!='(') { dest[i]=*s.top(); i++; s.pop(); } s.pop();//弹出左括号 } else if((*psrc=='+')||(*psrc=='-')||(*psrc=='*')||(*psrc=='/'))//如果是运算符 { while(!s.empty()&&GetPriority(*s.top())>=GetPriority(*psrc))//比较运算符优先级 {//若栈顶符号优先级不低 dest[i]=*s.top(); i++; s.pop(); } s.push(psrc);//栈顶符号优先级低 } else { cout<<"表达式中有非法字符"<<endl; return -1; } psrc++; } while(!s.empty()) { dest[i]=*s.top(); i++; s.pop(); } dest[i]='\0';//最后一个字符以\0结尾 return 0; } //运算法则 int Arithmetic(int left,int right,char c) { switch(c) { case '+': return left+right; case '-': return left-right; case '*': return left*right; case '/': if(right==0) { return 0; } else { return left/right; } default: return 0; } } //计算后缀表达式的运算结果 //说明此接口将结果返回,不怎么好,可以将结果传出,使用一级指针 //int calculate(char *str,int* out) int Calculate(char *src) { if(src==NULL) { return -1; } stack<int> s;//栈中放入int char* psrc=src; int result=0;//表达式计算的结果 while(*psrc!='\0') { if(isdigit(*psrc))//如果字符是数字时 { s.push(*psrc-'0');//将数字符号转化为int压入栈中 } else if((*psrc=='+')||(*psrc=='-')||(*psrc=='*')||(*psrc=='/'))//如果是符号 { int right=s.top();//拿到左操作数,并弹出 s.pop(); int left=s.top();//拿到右操作数,并弹出 s.pop(); int re=Arithmetic(left,right,*psrc); s.push(re);//将运算结果压入栈中 } else { cout<<"表达式中有非法字符"<<endl; return -1; } psrc++; } if(s.size()==1)//栈中只有一个结果时,就是最终运算结果 { result=s.top(); return result; //s.pop(); } else { cout<<"运算结果不正确"<<endl; return -1; } return result; } int main() { char *exp="(2+4)*3-9"; cout<<"中缀表达式:"<<exp<<endl; if(Scanner(exp)!=0) { printf("表达式匹配失败\n"); return -1; } char newexp[128]; Transform(exp,newexp); cout<<"后缀表达式:"<<newexp<<endl; int re=Calculate(newexp); cout<<"运算结果为:"<<re<<endl; return 0; }