7-20 表达式转换 (25 分)(代码详解+题目分析)
一:題目
算術表達式有前綴表示法、中綴表示法和后綴表示法等形式。日常使用的算術表達式是采用中綴表示法,即二元運算符位于兩個運算數中間。請設計程序將中綴表達式轉換為后綴表達式。
輸入格式:
輸入在一行中給出不含空格的中綴表達式,可包含+、-、*、\以及左右括號(),表達式不超過20個字符。
輸出格式:
在一行中輸出轉換后的后綴表達式,要求不同對象(運算數、運算符號)之間以空格分隔,但結尾不得有多余空格。
輸入樣例:
2+3*(7-4)+8/4
輸出樣例:
2 3 7 4 - * + 8 4 / +
二:思路和坑
首先這道題要用到 棧吧 ,然后 就是一個設置運算符的優先級 用到了map ,再者 就是 這個題的例子 賊狗 要考慮 正負號的問題(正號省略不寫 但負號 就一定要考慮進去) 其他 一些的優先級 我在次羅列出來
中綴表達式轉后綴表達式的方法:
1.遇到操作數:直接輸出(添加到后綴表達式中)
2.棧為空時,遇到運算符,直接入棧
3.遇到左括號:將其入棧
4.遇到右括號:執行出棧操作,并將出棧的元素輸出,直到彈出棧的是左括號,左括號不輸出。
5.遇到其他運算符:加減乘除:彈出所有優先級大于或者等于該運算符的棧頂元素,然后將該運算符入棧
6.最終將棧中的元素依次出棧,輸出。
注意:如果是在括號 中 遇到 (符號優先級的問題時 輸出停止條件 中 有 棧頂 不等于 ’(‘)
三:上碼(上馬 讓我們騎馬游蕩天涯)
/* 中綴表達式轉后綴表達式的方法: 1.遇到操作數:直接輸出(添加到后綴表達式中) 2.棧為空時,遇到運算符,直接入棧 3.遇到左括號:將其入棧 4.遇到右括號:執行出棧操作,并將出棧的元素輸出,直到彈出棧的是左括號,左括號不輸出。 5.遇到其他運算符:加減乘除:彈出所有優先級大于或者等于該運算符的棧頂元素,然后將該運算符入棧 6.最終將棧中的元素依次出棧,輸出。 */#include<bits/stdc++.h> using namespace std;int main(){stack<char>s;map<char,int>m;//設置符號間的優先級m['+'] = 1; m['-'] = 1;m['*'] = 2; m['/'] = 2;m['('] = 3; m[')'] = 3;int flag = 0;string str;cin >> str;for( int i = 0; i < str.size(); i++ ){//判斷代碼當中是否有數字 或則小數點 或則是 這個數帶符號(負號) if( ( ((i == 0) || str[i - 1] == '(') && (str[i] == '+' || str[i] == '-'))// 如果是負數則 eg(-10) 其中 i = 0 考慮到 第一個數 如果是 eg +10 || ( str[i] >='0' && str[i] <= '9') || ( str[i] == '.' )){if(flag != 0 ){cout << ' '; } if( str[i] != '+'){cout << str[i];//此處是如果輸出的是負號 則輸出 如果是正號則不輸出 }//這是要輸出的數字eg 5.5 while( (str[i+1] == '.') || (str[i + 1] >= '0' && str[i + 1] <= '9')){ i++;cout << str[i];} flag = 1;} else{if(str[i] == ')'){while(!s.empty() && s.top() != '('){cout << ' ' << s.top();s.pop(); }s.pop();//將棧中的'(' 刪除 }else if(s.empty() || m[str[i]] > m[s.top()]){s.push(str[i]); }else{//將優先級小于str[i] 輸出去 但沒遇到')' 所以 '(' 不用輸出 while( !s.empty() && s.top() != '('){cout << ' ' << s.top();s.pop(); } s.push(str[i]);} } }//將棧中剩余的符號輸出來while(!s.empty()){cout << ' ' << s.top();s.pop(); } }四:學習總結
做題都一樣遇到要考的算法不懂的就學,比如這個題當中這個轉換法則就是學的,但是這個題自己做了兩遍(每一遍花費4個多小時)都沒做出來 ,自己考慮的點 不周 還有 算法 不精湛,最后第三遍 參考了網上大佬的解法 但我都吃透大佬的代碼 自己又敲了一遍,菜鳥變大佬 ,我還有很長的路要走 如果你也是 那好 我們一塊加油 !
總結
以上是生活随笔為你收集整理的7-20 表达式转换 (25 分)(代码详解+题目分析)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LG C4 系列 OLED 电视爆料:支
- 下一篇: java当中日期类的相关操作(学习笔记)