C++中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的方法
本文實(shí)例為大家分享了C++中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的具體代碼,供大家參考,具體內(nèi)容如下
1、初始化兩個棧:運(yùn)算符棧s1和儲存中間結(jié)果的棧s2;
2、從左至右掃描中綴表達(dá)式;
3、遇到操作數(shù)時,將其壓s2;
4、遇到運(yùn)算符時,比較其與s1棧頂運(yùn)算符的優(yōu)先級:
1)、如果s1為空,或棧頂運(yùn)算符為左括號“(”,則直接將此運(yùn)算符入棧;
2)、否則,若優(yōu)先級比棧頂運(yùn)算符的高,也將運(yùn)算符壓入s1
3)、否則,將s1棧頂?shù)倪\(yùn)算符彈出并壓入到s2中,再次轉(zhuǎn)到(4-1)與s1中新的棧頂運(yùn)算符相比較;
5、遇到括號時:
1)、如果是左括號“(”,則直接壓入s1;
2)、如果是右括號“)”,則依次彈出s1棧頂?shù)倪\(yùn)算符,并壓入s2,直到遇到左括號為止,此時將這一對括號丟棄;
6、重復(fù)步驟2至5,直到表達(dá)式的最右邊;
7、將s1中剩余的運(yùn)算符依次彈出并壓入s2;
8、依次彈出s2中的元素并輸出,結(jié)果的逆序即為中綴表達(dá)式對應(yīng)的后綴表達(dá)式
代碼:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
stack<char> s1; //運(yùn)算符棧
stack<char> s2; //中間結(jié)果棧
int f(const char str){
int yxj; //優(yōu)先級
switch(str){
case '*':yxj=5;break;
case '/':yxj=5;break;
case '+':yxj=4;break;
case '-':yxj=4;break;
}
return yxj;
}
int main(){
char c[100]="(12+4-13)+6*2";
//char c[100]="1+((2+3)*4)-5";
int lenc=strlen(c);
//讀取字符串
for(int i=0;i<lenc;i++){
if(c[i]>='0'&&c[i]<='9'){ //如果是數(shù)字,直接壓入s2
s2.push(c[i]);
}else if(c[i]=='+'||c[i]=='-'||c[i]=='*'||c[i]=='/'){ //如果是運(yùn)算符
while(true){
if(s1.empty()||s1.top()=='('){ //s1為空 ,或者棧頂為(
s1.push(c[i]);
break;
}else if(f(c[i])>f(s1.top())){ //當(dāng)前運(yùn)算符優(yōu)先級大于s1棧頂運(yùn)算符優(yōu)先級
s1.push(c[i]);
break;
}
else{ //小于等于
char cc=s1.top();
s1.pop();
s2.push(cc);
}
}
}else{
if(c[i]=='('){ //直接讀入
s1.push(c[i]);
}else{
while(s1.top()!='('){
char ccc=s1.top();
s1.pop();
s2.push(ccc);
}
s1.pop();
}
}
}
while(!s1.empty()){
char cccc=s1.top();
s2.push(cccc);
s1.pop();
}
//while(!s2.empty()){ //結(jié)果是逆序的
// cout<<s2.top();
// s2.pop();
//}
while(!s2.empty()){
char c=s2.top();
s1.push(c);
s2.pop();
}
while(!s1.empty()){
cout<<s1.top();
s1.pop();
}
return 0;
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
異步http listener 完全并發(fā)處理懲罰http懇求的小例子
異步http listener 完全并發(fā)處理懲罰http懇求的小例子,需要的朋友可以參考一下2013-05-05
OpenCV數(shù)字圖像處理基于C++之圖像形態(tài)學(xué)處理詳解
OpenCV是一款由Intel公司俄羅斯團(tuán)隊發(fā)起并參與和維護(hù)的一個計算機(jī)視覺處理開源軟件庫,支持與計算機(jī)視覺和機(jī)器學(xué)習(xí)相關(guān)的眾多算法,下面這篇文章主要給大家介紹了關(guān)于OpenCV數(shù)字圖像處理基于C++之圖像形態(tài)學(xué)處理的相關(guān)資料,需要的朋友可以參考下2022-12-12
vc6.0中c語言控制臺程序中的定時技術(shù)(定時器)
這篇文章主要介紹了vc6.0中c語言控制臺程序中的定時技術(shù)(定時器),需要的朋友可以參考下2014-04-04
深入理解c++實(shí)現(xiàn)Qt信號和槽機(jī)制
信號和槽機(jī)制是 Qt 的核心機(jī)制,可以讓編程人員將互不相關(guān)的對象綁定在一起,實(shí)現(xiàn)對象之間的通信,本文就來深入理解c++實(shí)現(xiàn)Qt信號和槽機(jī)制,感興趣的可以了解一下2023-08-08
OpenCV中findContours函數(shù)參數(shù)詳解
Opencv中通過使用findContours函數(shù),簡單幾個的步驟就可以檢測出物體的輪廓,很方便。本文將和大家一起探討一下findContours方法中各參數(shù)的含義及用法,感興趣的可以了解一下2022-08-08
C和MFC巧妙獲取外網(wǎng)IP的兩種實(shí)現(xiàn)方法
這篇文章主要介紹了C和MFC巧妙獲取外網(wǎng)IP的兩種實(shí)現(xiàn)方法,功能非常的實(shí)用,需要的朋友可以參考下2014-07-07

