📄
字号:
#include <iostream>
using namespace std;
class midtofront{
public:
midtofront();
~midtofront();
void placechar(char);//处理字符
bool isnumber(char);//判断字符是否是操作数
int grade(char); //设置优先级
void getrest();
void calculate();//转换成后序表达式后计算
void printprocess(char,int, int, int);
void Delete(int i);
void getresult();
void exchange();//将result中的字符全部转化成Int
void value();
private:
char* operater;//设置3个栈:运算符栈、操作数栈、结果栈(存放最后结果)
char* result;
int* r;
int cop;
int cnum;
int cresult;
};
midtofront::midtofront(){
cop = 0;
cnum = 0 ;
cresult = 0;
r = new int [14];
operater = new char [7];
result = new char [14];
}
midtofront::~midtofront(){
delete operater;
delete result;
delete r;
}
void midtofront::placechar(char a){//处理字符
if (isnumber(a)){ //凡遇到操作数就直接输出
result[cresult] = a;
cresult ++ ;
}
else
if ( cop == 0 ){ //若栈为空,运算符直接进栈
operater[cop] = a;
cop ++ ;
}
else
if( a == ')' ){ //若为) :则比较到在站顶遇到对应的(,弹出即可,)不必进栈
while ( operater[cop-1]!='(' ){
result[cresult] = operater[cop-1];
cresult++;
cop --;
}
cop--; //弹出(
}
else
if( grade(a) > grade(operater[cop-1])){//新运算符 〉站顶运算符:新运算符进栈
operater[cop] = a;
cop ++ ;
}
else{ //相同或 < 站顶运算符:站定运算符输出并退栈
while(operater[cop-1]!='(' && cop > 0){
result[cresult] = operater[cop-1];
cop--;
cresult++;
}
operater[cop] = a ;
cop++;
}
}
bool midtofront::isnumber(char a){//判断字符是否是操作数
if ( a == '+' || a == '-' || a == '*' || a == '/' || a == '(' || a == ')' )
return false;
else
return true;
}
void midtofront::getrest(){ //读完表达式,将栈中剩余运算符依次输出,直到栈空为止
while(cop!=0){
result[cresult] = operater[cop-1];
cresult++;
cop--;
}
}
void midtofront::calculate(){
int temp;
int t = 2;
while(cresult!=1){
for(int i =t; i <= cresult-1 ; i++ ){
if (r[i]>0){
t++;
break;
}
else{
t--;
switch(r[i]){
case -5: temp = r[i-2] + r[i-1] ; printprocess('+',r[i-2],r[i-1],temp ); r[i-2]= temp; Delete(i); break;
case -3: temp = r[i-2] - r[i-1] ; printprocess('-',r[i-2],r[i-1],temp ); r[i-2]= temp; Delete(i); break;
case -6: temp = r[i-2] * r[i-1] ; printprocess('*',r[i-2],r[i-1],temp ); r[i-2]= temp; Delete(i); break;
case -1: temp = r[i-2] / r[i-1] ; printprocess('/',r[i-2],r[i-1],temp ); r[i-2]= temp; Delete(i); break;
}
}//else
break;
}//for
}//while
}
void midtofront::exchange(){将result中的char型转换成int型
for(int i = 0; i < cresult; i ++){
r[i] = (int)result[i] - 48 ;
cout << r[i] << " " ;
}
cout << endl;
}
int midtofront::grade(char a){//设置优先级
switch(a){
case '+': return 1;
case '-': return 1;
case '*': return 2;
case '/': return 2;
case '(': return 3;
}
return 0;
}
void midtofront::printprocess(char s,int t1,int t2,int temp){
cout << t1 <<" "<< s <<" "<< t2 << " = " << temp << endl;
}
void midtofront::value(){ //四则运算结果
cout << "the result is : " << r[0] << endl;
}
void midtofront::Delete(int i){ //将运算符和运算符前面的字符都删除
for(int f = i-1 ; f <= cresult-1 ; f++ )
r[f] = r[f+1];
cresult--;
for( f = i-1 ; f <= cresult-1 ; f++ )
r[f] = r[f+1];
cresult--;
}
/*void midtofront::getresult(){ //后序表达式结果
cout << "the result is : " ;
for ( int i = 0 ; i < cresult ; i++)
cout << result[i] << " " ;
cout << endl;
}*/
void main(){
midtofront mf;
char *mid = new char [14];
cout << "enter : " ;
cin >> mid ;
for (int i = 0 ; mid[i]!='\0' ; i ++ )
mf.placechar(mid[i]);
mf.getrest();
mf.getresult();//后序表达式
mf.exchange();//将表达式全部转化成Int型
mf.calculate();//开始计算表达式
mf.value();
}
/*转化原则
第一:从左向右扫描中缀表达式
第二:凡遇到操作数就直接输出
第三:凡遇到运算符与站顶运算符比较优先级(第一个运算符直接进站)
1 若栈为空,运算符直接进栈
2 新运算符 〉站顶运算符:新运算符进栈
相同或 < 站顶运算符:站定运算符输出并退栈
若为( :则比较到在站顶遇到对应的(,弹出即可,)不必进栈
第四:重复2 3,直到读完表达式,将栈中剩余运算符依次输出,直到栈空为止。即得结果*/
// cout << (int)'+'<<endl<<(int)'-'<<endl<<(int)'*'<<endl<<(int)'/'<<endl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -