⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 .cpp文件。输入中序表达式
💻
字号:
#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 + -