Removing Brackets from an Algebraic String Containing + and – Operators using C++

Given an algebraic string like p-(q-r)-s, we need to remove the brackets and convert this string to a string with the same mathematical result. So the string p-(q-r)-s is converted to p-q+r-s, giving us the same mathematical result. To achieve this, we can use a stack and keep track of whether or not we should flip the upcoming signs in the bracket expression.

  • 0 mean + or no flip

  • 1 mean - or flip

So on every bracket opening, we will push either 0 or 1 depending on whether the signs in this bracket will flip or not. We will pop the stack when we see a closing bracket.

Note ? We have not considered a string that starts with a bracket. We must sanitize such a type of string. For example s="(p-(q+r))" must be s="p-(q+r)". We can easily run the loop from index 1 to length -2, then 0 to length-1 in that case.

Let us look at some input scenarios

Assume the input given to the method are numbers in string data type, in the resultant list, we obtain the expression as it was given except the brackets ?

Input: (2×3)?(6?(4+5))
Result: 2×3-6+4+5

Assume the input given to the method start with the brackets, in the resultant list, we obtain an expression without the brackets as follows ?

Input: (a+(b-c-d)-e)
Result: a-b+c+d+e

Note ? We have not considered a string that starts with a bracket in the program. We must sanitize such a type of string. For example s="(a+(b-c-d)-e)" must be s="a+(b-c-d)-e". We can easily run the loop from index 1 to length -2, then 0 to length-1 in that case.

Here we can play around with polynomial expressions containing brackets as input, so in the resultant list, we obtain the expression as follows ?

Input: (p*p)-(p-q)
Result: p*p-p+q

We applied it on a quadratic polynomial but this method can be used for higher degree polynomial expressions as well.

Example

Suppose we have three strings S1, S2, and S3 with the following values ?

<span class="kwd">string</span><span class="pln"> s1 </span><span class="pun">=</span><span class="pln"> </span><span class="str">"p-(-q+(-r+(s-t)))"</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">string</span><span class="pln"> s2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">"(p+q-r+t+u)"</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">string</span><span class="pln"> s3 </span><span class="pun">=</span><span class="pln"> </span><span class="str">"(p+ (q-r-t)-u)"</span><span class="pun">;</span>

So let's use the C++ approach to remove the brackets from the above string containing + and - operators. Here is the C++ program for the given problem ?

<div class="execute"></div><div class="code-mirror  language-cpp" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><iostream></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stack></span></span>
<span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>
string <span class="token function">solve</span><span class="token punctuation">(</span>string s<span class="token punctuation">)</span> <span class="token punctuation">{</span>
   stack<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> sk<span class="token punctuation">;</span>
   sk<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   string res <span class="token operator">=</span> <span class="token string">""</span><span class="token punctuation">;</span>
   <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator"><</span>s<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">if</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">'('</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
         <span class="token keyword">int</span> temp <span class="token operator">=</span> s<span class="token punctuation">[</span>i<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">'+'</span> <span class="token operator">?</span> <span class="token number">0</span> <span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">;</span>
         <span class="token keyword">if</span><span class="token punctuation">(</span>sk<span class="token punctuation">.</span><span class="token function">top</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> sk<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>temp<span class="token punctuation">)</span><span class="token punctuation">;</span>
         <span class="token keyword">else</span> sk<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>temp<span class="token operator">^</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">')'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
         sk<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">'+'</span> <span class="token operator">||</span> s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">'-'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
         <span class="token keyword">char</span> op<span class="token punctuation">;</span>
         <span class="token keyword">if</span><span class="token punctuation">(</span>sk<span class="token punctuation">.</span><span class="token function">top</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> op <span class="token operator">=</span> s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span>
         <span class="token keyword">else</span> op <span class="token operator">=</span> <span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token operator">==</span><span class="token string">'+'</span> <span class="token operator">?</span> <span class="token string">'-'</span> <span class="token operator">:</span> <span class="token string">'+'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
         <span class="token keyword">if</span><span class="token punctuation">(</span>res<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token number">0</span> <span class="token operator">&&</span> <span class="token punctuation">(</span>res<span class="token punctuation">[</span>res<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">==</span><span class="token string">'+'</span> <span class="token operator">||</span> res<span class="token punctuation">[</span>res<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">==</span><span class="token string">'-'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> res<span class="token punctuation">[</span>res<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> op<span class="token punctuation">;</span>
         <span class="token keyword">else</span> res<span class="token operator">+=</span>op<span class="token punctuation">;</span>
      <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
         res<span class="token operator">+=</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
   <span class="token punctuation">}</span>
   <span class="token keyword">return</span> res<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
   string s1 <span class="token operator">=</span> <span class="token string">"p-(-q+(-r+(s-t)))"</span><span class="token punctuation">;</span>
   string s2 <span class="token operator">=</span> <span class="token string">"(p+q-r+t+u)"</span><span class="token punctuation">;</span>
   string s3 <span class="token operator">=</span> <span class="token string">"(p+ (q-r-t)-u)"</span><span class="token punctuation">;</span>
   cout <span class="token operator"><<</span> <span class="token function">solve</span><span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
   cout <span class="token operator"><<</span> <span class="token function">solve</span><span class="token punctuation">(</span>s2<span class="token punctuation">)</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
   cout <span class="token operator"><<</span> <span class="token function">solve</span><span class="token punctuation">(</span>s3<span class="token punctuation">)</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
   <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</div><div class="output-wrapper"><div class="console-close"></div><div class="code-output"></div></div>

Output

p+q+r-s+t
p-q+r-t-u
p- q-r-t+u

Conclusion

We use a simple stack to track the sign for each bracket opening. After that, with signs, we transform values one by one. The key was to identify how to keep track of the changing signs with brackets, after which the problem becomes easy.

Updated on: 2022-08-10T07:47:23+05:30

693 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements