c++接尾辞式回転接尾辞式および接尾辞式の計算
36871 ワード
みんなの批判と是正を歓迎する
接尾辞式変換接尾辞式および接尾辞式の計算
一、接尾辞式回転接尾辞式
手順:1.2つの空きスタックS 1,S 2を用意する
2.数字が直接S 1に押し込まれると
3.操作シンボルに遭遇した場合、S 2が空である場合、または現在のシンボルの優先度がS 2スタックトップオペレータの優先度より大きい場合、または'('左かっこ)、またはS 2スタックトップが'('左かっこ)である場合、現在のオペレータは直接S 2に押し込まれる
4.オペレータに遭遇した場合、現在のオペレータの優先度がS 2スタックトップオペレータの優先度以下である場合、S 2はスタックトップをポップアップし、S 2が空になるまでS 1を押し込むか、左かっこ'(')、または現在のシンボルの優先度未満である場合、現在のシンボルをS 2に押し込む
5.右括弧')'に遭遇した場合、S 2はスタックの上部をポップアップし、S 1を押して左括弧'('をポップアップするまで、括弧を省略する
6.最後に、S 2スタックをポップアップし、S 1が空になるまで押し込む.
このときS 1が格納する逆の順序が接尾辞式である
例:
1+(3-4 x 2+5)/2を接尾辞式に変換します.
まず、2つの空きスタックS 1,S 2を持ってきて、順次遍歴式から.
「1」は数字であり、S 1;'+'に直接圧入する.は符号であり、S 2は空であり、S 2を押し込む.(’左括弧はS 2に直接圧入する;‘3’は数字で、直接S 1に圧入する;‘−’は記号で、S 2スタックの頂上は‘(’,‘−’を直接S 2に圧入する;‘4’は数字であり,直接S 1に圧入する;‘x’は記号であり,S 2スタックトップは‘−’であり,優先度‘x’>‘−’であり,‘x’をS 2に圧入する;‘2’は数字であり,直接S 1に圧入する;‘+’は記号であり,S 2スタックトップは‘x’であり,優先度‘x’>‘+’であり,S 2スタックトップをポップアップし,S 1を圧入し,S 2スタックトップ優先度が‘+’より小さくなるまで,’+’圧入S 2;’2’は数字であり、S 1;')に直接圧入する.右括弧に遭遇して、S 2スタックの頂上を絶えずポップアップし始め、S 1に押し込む.左かっこに出会ったことを知って、かっこを捨てます;'/'シンボルであり、S 2スタックの上部は「-」、優先度「/」>「-」であり、「x」をS 2に押し込む.その後、S 2スタックの上部を順次ポップアップし、S 1に押し込み、S 2が空であることを知る.その後、S 1スタックの上部を順次ポップアップし、S 2を押し込み、S 1が空であることを知る.その後、S 2スタックトップを順次ポップアップし、出力する.
1 3 4 2 x - 5+2/+
二、接尾辞式の計算
手順:1.もう一度スタックs 3を持ってきてください.2.上記のs 2スタックの上部をポップアップし、オペレータに遭遇するまでs 3を押し込む.3.s 3スタックトップの次の加算/減算/乗算/除算で、結果をs 3に圧入する.3.このようにs 2が空になるまで、s 3は接尾辞式の演算結果である要素が1つしかない.
例:
上記接尾辞式1 3 4 2 x-5+2/+1入スタック、3入スタック、4入スタック、2入スタック、x計算4 x 2得8、入スタック.このときスタック内の要素は1 3 8(8はスタックトップ);'-'3-8を計算すると-5がスタックに入り、このときスタック要素は1-5(-5がスタックトップ)5がスタックに入り、+計算-5+5が0がスタックに入り、このときスタック要素は1 0(0がスタックトップ)2がスタックに入り、/計算0/2が0がスタックに入り、このときスタック要素は1 0(0がスタックトップ)「+」計算1+0が接尾辞式の結果となる.
コード#コード#
接尾辞式変換接尾辞式および接尾辞式の計算
一、接尾辞式回転接尾辞式
手順:1.2つの空きスタックS 1,S 2を用意する
2.数字が直接S 1に押し込まれると
3.操作シンボルに遭遇した場合、S 2が空である場合、または現在のシンボルの優先度がS 2スタックトップオペレータの優先度より大きい場合、または'('左かっこ)、またはS 2スタックトップが'('左かっこ)である場合、現在のオペレータは直接S 2に押し込まれる
4.オペレータに遭遇した場合、現在のオペレータの優先度がS 2スタックトップオペレータの優先度以下である場合、S 2はスタックトップをポップアップし、S 2が空になるまでS 1を押し込むか、左かっこ'(')、または現在のシンボルの優先度未満である場合、現在のシンボルをS 2に押し込む
5.右括弧')'に遭遇した場合、S 2はスタックの上部をポップアップし、S 1を押して左括弧'('をポップアップするまで、括弧を省略する
6.最後に、S 2スタックをポップアップし、S 1が空になるまで押し込む.
このときS 1が格納する逆の順序が接尾辞式である
例:
1+(3-4 x 2+5)/2を接尾辞式に変換します.
まず、2つの空きスタックS 1,S 2を持ってきて、順次遍歴式から.
「1」は数字であり、S 1;'+'に直接圧入する.は符号であり、S 2は空であり、S 2を押し込む.(’左括弧はS 2に直接圧入する;‘3’は数字で、直接S 1に圧入する;‘−’は記号で、S 2スタックの頂上は‘(’,‘−’を直接S 2に圧入する;‘4’は数字であり,直接S 1に圧入する;‘x’は記号であり,S 2スタックトップは‘−’であり,優先度‘x’>‘−’であり,‘x’をS 2に圧入する;‘2’は数字であり,直接S 1に圧入する;‘+’は記号であり,S 2スタックトップは‘x’であり,優先度‘x’>‘+’であり,S 2スタックトップをポップアップし,S 1を圧入し,S 2スタックトップ優先度が‘+’より小さくなるまで,’+’圧入S 2;’2’は数字であり、S 1;')に直接圧入する.右括弧に遭遇して、S 2スタックの頂上を絶えずポップアップし始め、S 1に押し込む.左かっこに出会ったことを知って、かっこを捨てます;'/'シンボルであり、S 2スタックの上部は「-」、優先度「/」>「-」であり、「x」をS 2に押し込む.その後、S 2スタックの上部を順次ポップアップし、S 1に押し込み、S 2が空であることを知る.その後、S 1スタックの上部を順次ポップアップし、S 2を押し込み、S 1が空であることを知る.その後、S 2スタックトップを順次ポップアップし、出力する.
:
1 3 4 2 x - 5+2/+
1+(3-4x2+5)/2 。
//
#include
#include
#include
using namespace std;
int to_int(char c){
return c - '0';
}
int to_r(char c){//
if (c == '+' || c == '-')return 1;
else if (c == '*' || c == '/')return 2;
}
int main(){
stack<char> s1, s2;
string str; cin >> str;
for (int i = 0; i < str.length(); i++){
if (str[i] >= '0'&&str[i] <= '9'){
s1.push(str[i]);
}
else{
if (s2.empty()||str[i] == '('){// s2
s2.push(str[i]);
}
else if (str[i] == ')'){ // ,
while (s2.top() != '('){
s1.push(s2.top());
s2.pop();
}
s2.pop();
}
else if (s2.top() == '('||to_r(str[i])>to_r(s2.top()) ){
s2.push(str[i]);
}
else if (to_r(str[i]) <= to_r(s2.top())){
while (!s2.empty() && to_r(str[i]) <= to_r(s2.top())){
s1.push(s2.top());
s2.pop();
if (s2.top() == '(')break;
}
s2.push(str[i]);
}
}
}
while (!s2.empty()){
s1.push(s2.top());
s2.pop();
}
while (!s1.empty()){
s2.push(s1.top());
s1.pop();
}
while(!s2.empty()){
cout << s2.top() << " ";
s2.pop();
}
system("pause");
return 0;
}
二、接尾辞式の計算
手順:1.もう一度スタックs 3を持ってきてください.2.上記のs 2スタックの上部をポップアップし、オペレータに遭遇するまでs 3を押し込む.3.s 3スタックトップの次の加算/減算/乗算/除算で、結果をs 3に圧入する.3.このようにs 2が空になるまで、s 3は接尾辞式の演算結果である要素が1つしかない.
例:
上記接尾辞式1 3 4 2 x-5+2/+1入スタック、3入スタック、4入スタック、2入スタック、x計算4 x 2得8、入スタック.このときスタック内の要素は1 3 8(8はスタックトップ);'-'3-8を計算すると-5がスタックに入り、このときスタック要素は1-5(-5がスタックトップ)5がスタックに入り、+計算-5+5が0がスタックに入り、このときスタック要素は1 0(0がスタックトップ)2がスタックに入り、/計算0/2が0がスタックに入り、このときスタック要素は1 0(0がスタックトップ)「+」計算1+0が接尾辞式の結果となる.
コード#コード#
//
#include
#include
#include
using namespace std;
int to_int(char c){
return c - '0';
}
int to_r(char c){//
if (c == '+' || c == '-')return 1;
else if (c == '*' || c == '/')return 2;
}
int op(int a, int b, char c){ //
if (c == '+')return a + b;
else if (c == '-')return a - b;
else if (c == '*')return a*b;
else if (c == '/')return a / b;
}
int main(){
stack<char> s1, s2;
string str; cin >> str;
for (int i = 0; i < str.length(); i++){
if (str[i] >= '0'&&str[i] <= '9'){
s1.push(str[i]);
}
else{
if (s2.empty()||str[i] == '('){
s2.push(str[i]);
}
else if (str[i] == ')'){
while (s2.top() != '('){
s1.push(s2.top());
s2.pop();
}
s2.pop();
}
else if (s2.top() == '('||to_r(str[i])>to_r(s2.top()) ){
s2.push(str[i]);
}
else if (to_r(str[i]) <= to_r(s2.top())){
while (!s2.empty() && to_r(str[i]) <= to_r(s2.top())){
s1.push(s2.top());
s2.pop();
if (s2.top() == '(')break;
}
s2.push(str[i]);
}
}
}
while (!s2.empty()){
s1.push(s2.top());
s2.pop();
}
while (!s1.empty()){
s2.push(s1.top());
s1.pop();
}
stack<int> s3;
while (!s2.empty()){
if (s2.top() >= '0'&&s2.top() <= '9'){
s3.push(to_int(s2.top()));
s2.pop();
}
else{
int a = s3.top(); s3.pop();
int b = s3.top(); s3.pop();
int c = op(b, a, s2.top());
s2.pop();
s3.push(c);
}
}
cout << s3.top() << endl;
system("pause");
return 0;
}