1. 程式人生 > >中綴表示式轉換成字尾表示式,自己寫的。

中綴表示式轉換成字尾表示式,自己寫的。

自己測試了幾個用例,都通過了。

語言是C++。

它用到的資料結構是:一個存放運算子的棧,名字是Sop,和一個存放字尾表示式的vector,名字是res。

它的規則是:

先設定好每個運算子的優先順序。

從左到右依次遍歷每一個字元。

1.遇到數字,直接放到push_back到vector裡面。

2.遇到 '(',直接壓到Sop的棧裡面。

3.遇到 ')',就把Sop的棧頂元素依次push_back到vector裡面,直到遇到 '(' ,但是注意,不要把左括號和右括號壓到棧裡。

4.遇到其他的運算子,

          (1)如果Sop是空的,直接入棧。

          (2)比較Sop的棧頂運算子和當前運算子的優先順序:

                            如果當前運算子str[i]的運算子   優先於   棧頂運算子Sop.top(),那麼str[i]入棧。                             如果不是,就一直彈出棧頂的運算子到vector裡面,直到彈到棧空或者彈到左括號。

5.當for遍歷完所有的字元之後,Sop這個棧裡還有運算子,那麼依次彈出棧頂元素直到棧空。

這個小demo是運算元只能個位的運算元。

測試過的式子有:

1+2

(1+2)+3

1+2*3

(1+2)*3

後續再補充,暫時沒發現錯誤。

#include <iostream> 
#include <cstring>
#include <cstdio>
#include <vector>
#include <stack>
#include <map>
using namespace std;

bool isNum(char a){
	return (a<='9'&&a>='0');
}
char* NifixToSuffix(char *str, vector<char> &res){
	stack<char> Sop;
	int k=0;
	map<char,int> priority;
	priority['(']=priority[')']=1;
	priority['^']=2;
	priority['/']=priority['*']=priority['%']=3;
	priority['+']=priority['-']=4;
	
	for(int i=0;i<strlen(str);i++){
		
		if(isNum(str[i])) res.push_back(str[i]);	
		else if(str[i]=='(') Sop.push(str[i]);
		else if(str[i]==')')
		{
			while(Sop.top()!='('){
				res.push_back(Sop.top());
				Sop.pop();
			}
			//remove '(' operator
			Sop.pop();
		}	
		else//是運算子 
		{	
			if(Sop.empty()) Sop.push(str[i]);
		    else if(priority[str[i]]<priority[Sop.top()])
				Sop.push(str[i]);
			else{
				while(priority[str[i]]>=priority[Sop.top()])
				{
					if(Sop.top()=='(') break;
					res.push_back(Sop.top());
					Sop.pop();
					if(Sop.empty()) break;
				}	
				Sop.push(str[i]);	
			}
		}
			
	}
	
	while(!Sop.empty()){
		res.push_back(Sop.top());
		Sop.pop();
	}
	
	for(int i=0;i<res.size();i++) cout<<res[i];
	cout<<endl;
	cout<<endl;
	cout<<endl;
}
int main() {
	char c2[]={'(','1','+','2','+','9','*','9',')','*','3','/','3'};
	vector<char> res ;
	res.clear();
	NifixToSuffix(c2,res);
	
	
}