1. 程式人生 > 實用技巧 >使用棧來計算字尾表示式

使用棧來計算字尾表示式

字尾表示式

我們平時寫的都是中綴表示式,也就是將運算子寫在2個運算元中間
而後綴表示式 則是將運算子寫在2個運算元後面
例如:

 (a+b)*c-(a+b)/e 的字尾表示式為:ab+c*ab+e/-

計算思路

從左到右掃描輸入串(string陣列):
1、若當前字元為數字(運算元),則將其放入棧
2、若當前字元為運算子,則依次取出棧頂的2個數,進行對應的運算,並將運算結果放入棧
3、指標讀取下一個字元,回到第1步


當遍歷完陣列後,棧中的唯一一個元素即為計算結果

程式碼實現(C++)

假設輸入的字串是一個 string類的陣列
全域性定義棧的相關變數和方法

const int N=100; //定義棧的最大容量
string data[N]; //使用陣列表示棧
int top=-1; //指向棧頂元素下標

//判斷棧是否為空 
bool isEmpty(){
      return top==-1 ? true : false;
}

//入棧 
void Push(string ele){
	if(top>=N-1){
		cout<<"棧已滿,無法插入"<<endl;
		return;
	}
	
	data[top+1]=ele;
	top++;
	return;
}

//出棧 
string Pop(){
	if(isEmpty()==true){
		cout<<"棧已空,無法出棧"<<endl;
		return "!";
	}
	
	string topEle=data[top];
	data[top]="null";
	top--;
	return topEle;
}

除此之外,我們需要一個判斷當前字元是否為數字的函式(利用ASCII碼判別)

bool isDigit(string v){
	if(int(v[0])<=57&&int(v[0])>=48){
		return true;
	}else{
		return false;
	}
}

用於計算表示式結果的函式

//傳入string陣列以及陣列長度
void calculate(string input[],int len){
    
	for(int i=0;i<len;i++){
		
		if(isDigit(input[i])==true){
			Push(input[i]);
		}else{
            // 將取出的棧頂元素轉換成int
			int v2=stoi(Pop());
			int v1=stoi(Pop());
			
			if(input[i]=="+"){
				Push(to_string(v1+v2));
			}else if(input[i]=="-"){
				Push(to_string(v1-v2));
			}else if(input[i]=="*"){
				Push(to_string(v1*v2));
			}
			else if(input[i]=="/"){
				Push(to_string(v1/v2));
			}else{
				cout<<"ERROR"<<endl;
			}
		}
	}
	
	cout<<data[0]<<endl;
	return;
}

參考樣例:
string input[]={"6","2","/","3","-","4","2","*","+"};
計算結果為:8