📄 expressionconversion2.cpp
字号:
//// ExpressionConversion.cpp : 定义控制台应用程序的入口点。
//// 将中缀表达式转换为逆波兰表达式
//// 同时输出计算结果
//
#include "stdafx.h"
#include <stdlib.h>
#include <locale>
#include <stdio.h>
#include <iostream>
#define Max 80
using namespace std;
int pri(char oper){ //calculate prior value of operator
int re;
switch(oper){
case '*':
case '/': re=2;break;
case '+':
case '-': re=1;break;
case '(': re=0;break;
case '$': re=-1;break;
default: re=-2;
}
return re;
}
int ExpCon(char *m,char *p){ //ExpCon expression
char stack[Max]="\0",c;
int top=0, j=0, i=0;
stack[0]='$';
c=m[0];
while(c!='\0'){
if(isdigit(c)) *(p+j++)=c; //测试元素是否为数值字符
else
switch(c){
case '+':
case '-':
case '*':
case '/':
while(pri(stack[++top])>=pri(c))
//优先级>=,就出栈
*(p+j++)=stack[top--];
stack[++top]=c;//优先级<,就进栈
break;
case '(':
stack[++top]=c;
break;
case ')':
while(stack[top]!='(')
*(p+j++)=stack[top--];
top--; //删除栈中的括号(
break;
default:
return 1;
}
c=*(m+(++i));//取下一个元素
}
while(top>0)
*(p+j++)=stack[top--];//取出栈中的所有操作符
*(p+j)='\0';
return 0;
}
int calculate(char *p,int *result){ //计算新表达式的值
int stack[Max],top=-1,tmp,i=0;
char c;
c=p[0]; //获取第一个字符
while(c!='\0'){ //直到表达式的结尾,结束循环
if(isdigit(c))
stack[top]=atoi(&c);
else
switch(c){ //判断操作符,进行相应的计算
case '+':
tmp=stack[top--];
stack[top]+=tmp;
break;
case '-':
tmp=stack[top--];
stack[top]-=tmp;
break;
case '*':
tmp=stack[top--];
stack[top]*=tmp;
break;
case '/':
tmp=stack[top--];
stack[top]/=tmp;
break;
default:
return 1; //返回错误
}
c=p[++i];
}
if(top>0) return 1; //返回错误
*result=stack[top];
return 0; //返回成功
}
int _tmain(int argc, _TCHAR* argv[])
{
char exp[Max]="5*(8-2)+9";
char pp[Max]="\0";
int i;
i=ExpCon(exp,pp); //表达式转换
cout<<"待转换的表达式为: "<<exp<<'\n';
if(i==0)
cout<<"转换后的表达式为: "<<pp<<endl;
else
cout<<"表达式转换错误!"<<endl;
if(calculate(pp,&i)==0)
cout<<"表达式的值为: "<<i<<endl;
else
cout<<"计算错误!"<<endl;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -