Thuật toán trung tố sang hậu tố

a/c cho em hỏi code bài này e code theo code của geeksforgeeks, khi chạy biểu thức của a+b*(c^d-e)^(f+g*h)-i thì đúng mà chạy biểu thức này thì lại sai: A * (B+C–D/E)/F
a/c cho em hỏi là sai chỗ nào không ạ và sửa như nào ạ. em cảm ơn ạ;

#include<bits/stdc++.h>
using namespace std;
int prec(char c){
	if( c == '(') return 0;
	if( c == '+' || c == '-' ) return 1;
	if( c == '*' || c == '/' || c == '%' ) return 2;
	if( c == '^' ) return 3;
}
void infixToPostfix(string s){
	int l=s.length(); string ns; 
	stack<char> st; st.push('N');
	for(int i=0;i<l;i++){
		if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')) {
			ns+=s[i]; 
		}
		else if(s[i]=='('){
			st.push(s[i]);
		} 
		else if(s[i]==')'){
			while(st.top()!='N'&&st.top()!='('){
				char c=st.top(); 
				st.pop();
				ns+=c;	
			}
			if(st.top()=='(') {
				char c = st.top(); 
				st.pop(); 
			}
		}
		else{
			while(st.top()!='N'&&prec(s[i])<=prec(st.top())){
				char c=st.top();
				st.pop();
				ns+=c;
			} 
			st.push(s[i]);
		}
	}
	while(st.top()!='N'){
		char c=st.top();
		st.pop();
		ns+=c;
	}
	cout<<ns;
}
main(){
	string exp = "A*(B+C–D/E)/F"; 
	infixToPostfix(exp); 
}
1 Like

Bạn để ý kỹ ký tự nha, nó không giống với dấu trừ (-) đâu. :slight_smile:

Xóa đi và gõ lại là hết.


Gfg lỏm, sao lại push N vô thế kia. Thường là push ( vô chứ.

5 Likes

Cảm ơn c cực kỳ nhiều nhé :)))

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?