給定一個像 p-(q-r)-s 這樣的代數字串,我們需要刪除括號並將字串轉換為具有相同數學結果的字串。因此,字串 p-(q-r)-s 被轉換為 p-q r-s,給出了相同的數學結果。為了實現這一點,我們可以使用堆疊並追蹤是否應該翻轉括號表達式中即將出現的符號。
0 表示 或無翻轉
1 表示 - 或翻轉
因此,在每個括號打開時,我們將根據括號中的符號是否翻轉來推送 0 或 1。當我們看到右括號時,我們將彈出堆疊。
注意 - 我們沒有考慮以括號開頭的字串。我們必須清理這種類型的字串。例如 s="(p-(q r))" 必須是 s="p-(q r)"。在這種情況下,我們可以輕鬆地執行從索引 1 到長度 -2,然後從 0 到長度-1 的循環。
讓我們來看一些輸入場景
假設該方法的輸入是字串資料類型的數字,在結果清單中,我們得到括號以外的表達式 -
Input: (2×3)─(6─(4+5)) Result: 2×3–6+4+5
假設方法的輸入以括號開頭,在結果清單中,我們得到一個不帶括號的表達式,如下 -
Input: (a+(b-c-d)-e) Result: a-b+c+d+e
注意 - 我們沒有考慮程式中以括號開頭的字串。我們必須清理這種類型的字串。例如 s="(a (b-c-d)-e)" 必須是 s="a (b-c-d)-e"。在這種情況下,我們可以輕鬆地執行從索引 1 到長度 -2,然後從 0 到長度-1 的循環。
這裡我們可以使用包含括號的多項式表達式作為輸入,因此在結果清單中,我們得到以下表達式 -
Input: (p*p)-(p-q) Result: p*p-p+q
我們將其應用於二次多項式,但此方法也可用於更高階的多項式表達式。
假設我們有三個字串 S1、S2 和 S3,其值如下 -
string s1 = "p-(-q+(-r+(s-t)))"; string s2 = "(p+q-r+t+u)"; string s3 = "(p+ (q-r-t)-u)";
因此,讓我們使用 C 方法從上麵包含 和 - 運算子的字串中刪除括號。這是針對給定問題的 C 程式 -
#include <iostream> #include <stack> using namespace std; string solve(string s) { stack<int> sk; sk.push(0); string res = ""; for(int i=0;i<s.size();i++) { if(s[i] == '(') { int temp = s[i-1] == '+' ? 0 : 1; if(sk.top() == 0) sk.push(temp); else sk.push(temp^1); } else if(s[i] == ')') { sk.pop(); } else if(s[i] == '+' || s[i] == '-') { char op; if(sk.top() == 0) op = s[i]; else op = (s[i]=='+' ? '-' : '+'); if(res.size() != 0 && (res[res.size()-1]=='+' || res[res.size()- 1]=='-')) res[res.size()-1] = op; else res+=op; } else { res+=s[i]; } } return res; } int main() { string s1 = "p-(-q+(-r+(s-t)))"; string s2 = "(p+q-r+t+u)"; string s3 = "(p+ (q-r-t)-u)"; cout << solve(s1) << endl; cout << solve(s2) << endl; cout << solve(s3) << endl; return 0; }
p+q+r-s+t p-q+r-t-u p- q-r-t+u
我們使用一個簡單的堆疊來追蹤每個括號開口的標誌。然後,用符號,我們把價值觀一一轉化。關鍵是要確定如何用括號追蹤變化的符號,之後問題就變得容易了。
以上是使用C++移除包含+和-運算子的代數字串中的括號的詳細內容。更多資訊請關注PHP中文網其他相關文章!