中綴表示式轉字尾表示式
中綴表示式就是我們常見的算術表示式,比如:23+4(3+5)+10/2,運算子在運算數之間,而字尾表示式就是比如:59684/-3+#,運算子在運算數的後面,所以要把中綴表示式轉字尾表示式,用棧來實現。
因為*/的優先順序大於±,所以如下所示:
1.如果是運算元,直接輸出,即為字尾表示式的。
2.如果棧為空,就代表沒有運算子,所以遇到運算子就壓入棧中。
3.如果是( ,直接壓入棧中。
4.如果是 ),就開始出棧,直到遇到( ,但( 不輸出,只彈出。
5.如果是+ - ,因為±的優先順序比 乘除 小,所以只有遇到優先順序最小的(,才能入棧,所以就出棧,直到遇到(,再把現在的壓進去棧。
6.如果是乘除,優先順序高,所以只有遇到棧頂同樣是乘除,才可以彈出,然後把現在的壓進去棧。
7.最後把棧中的都彈出來。
總結一下,就是( 壓入棧中優先順序降為最小,直到遇到),才可出棧,其他運算子,如果棧頂的優先順序比自己大或跟自己相同,彈出棧頂,直到棧頂的優先順序小於自己,再把自己壓進去。最後當所有運算元都走完,再把棧中的都彈出來。
#include
using namespace std;
int main(
)else if(s[i]
=='('
)else if(s[i]
==')'
) top--;
}else if(s[i]
=='+'
||s[i]
=='-'
) stack[++top]
=s[i];}
else if(s[i]
=='*'
||s[i]
=='/'
) stack[++top]
=s[i];}
} while(top!=0)
return 0;
}
算術表示式轉字首,中綴,字尾
#include
using namespace std;
int cmp(char x)
void work1(string ch)
stacks1;
stacks2;
for(int i=0;ielse
s2.pop();
} else
} else}}
} while(
!s2.empty(
)) while(
!s1.empty(
)) cout<}void work2 (string ch)
cout<}void work3(string ch)
else if(ch[i]
=='('
)else if(ch[i]
==')'
) top--;
}else if(ch[i]
=='+'
||ch[i]
=='-'
) stack[++top]
=ch[i];}
else if(ch[i]
=='*'
||ch[i]
=='/'
) stack[++top]
=ch[i];}
} while(top!=0)
}int main(
)
二元運算子過載
siwuxie095 二元運算子過載 所謂 二元運算子,即 這個符號與兩個運算元進行運算 1 加號 的過載 加號 的過載方式有兩種 一種是友元函式過載,一種是成員函式過載 1 先來看成員函式過載,如下 定義乙個座標類 coordinate 在類中宣告成員函式 operator 它的引數是 const...
二元加運算子
減法,乘法,除法在運算過程中,都是先將運算元,轉成數值,再進行後續操作,而加法,卻有所不一樣。當兩個數值相加時,加法運算子,跟減法操作符一樣,直接求和。var a 1 var b 2 a b 3當兩個字串相加時,加法運算子,這表現為字串拼接。var a 1 var b 2 a b 12 注意 只有有...
C 二元運算子過載
二元運算子需要兩個引數,下面是二元運算子的例項。我們平常使用的加運算子 減運算子 乘運算子 和除運算子 都屬於二元運算子。就像加 運算子。下面的例項演示了如何過載加運算子 類似地,您也可以嘗試過載減運算子 和除運算子 include using namespace std class box voi...