中缀转后缀表达式求值(未学过字符串,栈,队列的不要看)

Ollieto 2020-08-17 9:25:19 2020-08-17 10:16:19 0
#include<iostream>

#include<stack>

#include<string>

using namespace std;

bool ds(char a,char b){
	if(a=='*' && b=='+' || a=='*' && b=='-' || a=='/' && a=='+' || a=='/' && a=='-') return true;
	else return false;
}

string kd(string z){
	
	int m =0;

	string z1 = z;

stack<char> s;

	//从左往右扫描; 

	for(int i=0;i<=z.length()-1;i++){


		//遇到数字则直接输出; 

		if(z[i]>='0' && z[i]<='9'){

			z1[m] = z[i];m++;

		}

	 	//遇到左括号则直接压栈; 

		else if(z[i]=='('){

			s.push('('); 

		}
		// 遇到右括号,则不断弹出栈顶运算符并输出直到遇到左括号; 

		else if(z[i]==')'){

			while(s.top()!='('){

				z1[m] = s.top();m++;

				s.pop();

			}

			s.pop();

		}
	//若遇到运算符则把它与栈顶元素相比较:..... 

		else if(z[i]=='+' || z[i]=='/' || z[i]=='*' || z[i]=='-'){



			if(s.empty()==true || s.top()=='('){

				s.push(z[i]); 

	}

	        else if( ds(z[i],s.top())==true){

	        		s.push(z[i]); 

			}

			else if(ds(z[i],s.top())==false){

				while(s.size()!=0 || s.top()!='(' || ds(z[i],s.top())==false){

				z1[m] = s.top();m++;

				s.pop();

				}

				s.push(z[i]); 
			}

		}

	} 

	//输出运算符; 

	 while(s.size()!=0){

	 	z1[m] = s.top();m++;

	 	s.pop();
	 }

	return z1;

}

int shu(char c){
	switch(c){


		case '0':return 0;break;

		case '1':return 1;break;

		case '2':return 2;break;

		case '3':return 3;break;
		case '4':return 4;break;

		case '5':return 5;break;

		case '6':return 6;break;


		case '7':return 7;break;
		case '8':return 8;break;

		case '9':return 9;break;

	}

}



int main(){

	int c,b,a;
	string f,z;

	getline(cin,f,'=');

	z = kd(f); 

	stack<char> hz;

	for(int i=0;i<=z.length()-1;i++){

		//判断是否是个数; 
		if(z[i]>='0' && z[i]<='9'){

			 hz.push(z[i]); 

		}

		//判断是否是个运算符; 

		else if(z[i]=='-' || z[i]=='+' || z[i]=='*' || z[i]=='/'){

			c=shu(hz.top());
			hz.pop();
			b=shu(hz.top());

			hz.pop();

			switch(z[i]){

				case '-':a=b-c;break;

				case '+':a=b+c;break;

				case '/':a=b/c;break;

				case '*':a=b*c;break;
			}



			hz.push((char)(a+48)); 

		}

	}

	cout<<a; 



	return 0;

} 
{{ vote && vote.total.up }}

共 9 条回复

chen_zhe 沙雕

……

Ollieto

shu函数可以用-48代替,并且我还没有学过vect0r

Duke

%%%

chen_zhe 沙雕

哦,谢谢巨佬

Ollieto

chen_zhe沙雕 可以用

chen_zhe 沙雕

@pikahuan 中缀转后缀能用vector吗?

chen_zhe 沙雕

shu函数不可以用-48代替吗

pikahuan 逗比

vector不香吗

root 站长

写的不错。