日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

C++實現(xiàn)中綴轉(zhuǎn)后綴的示例詳解_C 語言

作者:是皮蛋瘦肉周 ? 更新時間: 2022-11-16 編程語言

單位數(shù)加減乘除

例如:2+3*(4-9)

定義一個棧內(nèi)優(yōu)先級

運算符號 優(yōu)先級
+、- 3
*、/ 5
( 1
) 6
# 0

定義一個棧外優(yōu)先級

運算符號 優(yōu)先級
+、- 4
*、/ 2
( 6
1
# 0

整個過程如下:

首先將#入棧,這是為了讓運算符與棧內(nèi)的符號進行比較是否入棧,否則無法判斷

  1. 2為數(shù)字,直接輸出
  2. +和#進行運算符比較,因為+的優(yōu)先級大于#,入棧
  3. 3為數(shù)字,直接輸出
  4. (和+進行比較,(的優(yōu)先級比+大,將+取出輸出,將(入棧
  5. 4為數(shù)字,直接輸出
  6. -的優(yōu)先級比’(‘大,直接入棧。注意:此時的’('為棧內(nèi)優(yōu)先級
  7. 9為數(shù)字。直接輸出
  8. )優(yōu)先級比-大,取出-,同時()配對了,也要將(取出
  9. 最后遍歷棧內(nèi)運算符即可

需要注意的點是:

就像這樣棧內(nèi)的頭頂兩個元素這樣(+,下一個符號剛好是),需要考慮到,取完+號后,需要把(也去取出來

實現(xiàn)代碼

#include<iostream>
#include<stack>
#include<string>
using namespace std;
//棧內(nèi)優(yōu)先級
int CompareIn(char c){
	if(c=='('){
		return 1;
	}
	if(c=='+'||c=='-'){
		return 3;
	}
	if(c=='*'||c=='/'){
		return 5;
	} 
	if(c==')'){
		return 6;
	}
	if(c=='#'){
		return 0;
	}
}
//棧外優(yōu)先級 
int CompareOut(char c){
	if(c=='('){
		return 6;
	}
	if(c=='+'||c=='-'){
		return 2;
	}
	if(c=='*'||c=='/'){
		return 4;
	} 
	if(c==')'){
		return 1;
	}
	if(c=='#'){
		return 0;
	}
}
int main(){
	string str;
	cin>>str;
	stack<char> q;
	q.push('#');
	for(int i=0;i<str.length();i++){		
		if('1'<=str[i]&&str[i]<='9'){
			cout<<str[i];
		}else{
			if(CompareIn(q.top())<CompareOut(str[i])){
				q.push(str[i]);
			}else if(CompareIn(q.top())==CompareOut(str[i])){
				q.pop();
			}else if(CompareIn(q.top())>CompareOut(str[i])){
				char ch=q.top();
				q.pop();
				cout<<ch;
				if(str[i]!=')'){
					q.push(str[i]);
				}	
			   if(CompareIn(q.top())==CompareOut(str[i])){
				q.pop();
		    	}
			}
		}
	}
	while(CompareIn(q.top())!=0){
		cout<<q.top();
		q.pop();
	}
	
}
}

原文鏈接:https://blog.csdn.net/weixin_66610130/article/details/127052478

欄目分類
最近更新