从包含 + 和 –运算符的代数字符串中删除括号
简化给定的代数字符串,“+”、“-”运算符和括号。输出不带括号的简化字符串。
例子:
Input : "(a-(b+c)+d)"
Output : "a-b-c+d"
Input : "a-(b-c-(d+e))-f"
Output : "a-b+c+d+e-f"
这个想法是在括号开始之前检查运算符,即在字符'('之前。如果运算符是 - ,我们需要切换括号内的所有运算符。使用一个堆栈,它只存储两个整数 0 和 1 来指示是否切换或不切换。
我们对输入字符串的每个字符进行迭代。最初将 0 压入堆栈。每当字符是运算符('+' 或 '-')时,检查堆栈顶部。如果栈顶为 0,则在结果字符串中附加相同的运算符。如果栈顶为 1,则在结果字符串中附加另一个运算符(如果 '+' 附加 '-')。
C++
// C++ program to simplify algebraic string
#include
using namespace std;
// Function to simplify the string
char* simplify(string str)
{
int len = str.length();
// resultant string of max length equal
// to length of input string
char* res = new char(len);
int index = 0, i = 0;
// create empty stack
stack s;
s.push(0);
while (i < len) {
// Don't do any operation
if(str[i] == '(' && i == 0) {
i++;
continue;
}
if (str[i] == '+') {
// If top is 1, flip the operator
if (s.top() == 1)
res[index++] = '-';
// If top is 0, append the same operator
if (s.top() == 0)
res[index++] = '+';
} else if (str[i] == '-') {
if (s.top() == 1) {
if(res[index-1] == '+' || res[index-1] == '-') res[index-1] = '+'; // Overriding previous sign
else res[index++] = '+';
}
else if (s.top() == 0) {
if(res[index-1] == '+' || res[index-1] == '-') res[index-1] = '-'; // Overriding previous sign
else res[index++] = '-';
}
} else if (str[i] == '(' && i > 0) {
if (str[i - 1] == '-') {
// x is opposite to the top of stack
int x = (s.top() == 1) ? 0 : 1;
s.push(x);
}
// push value equal to top of the stack
else if (str[i - 1] == '+')
s.push(s.top());
}
// If closing parentheses pop the stack once
else if (str[i] == ')')
s.pop();
// copy the character to the result
else
res[index++] = str[i];
i++;
}
return res;
}
// Driver program
int main()
{
string s1 = "(a-(b+c)+d)";
string s2 = "a-(b-c-(d+e))-f";
cout << simplify(s1) << endl;
cout << simplify(s2) << endl;
return 0;
}
Java
// Java program to simplify algebraic string
import java.util.*;
class GfG {
// Function to simplify the string
static String simplify(String str)
{
int len = str.length();
// resultant string of max length equal
// to length of input string
char res[] = new char[len];
int index = 0, i = 0;
// create empty stack
Stack s = new Stack ();
s.push(0);
while (i < len) {
// Don't do any operation
if(str.charAt(i) == '(' && i == 0) {
i++;
continue;
}
if (str.charAt(i) == '+') {
// If top is 1, flip the operator
if (s.peek() == 1)
res[index++] = '-';
// If top is 0, append the same operator
if (s.peek() == 0)
res[index++] = '+';
} else if (str.charAt(i) == '-') {
if (s.peek() == 1)
res[index++] = '+';
else if (s.peek() == 0)
res[index++] = '-';
} else if (str.charAt(i) == '(' && i > 0) {
if (str.charAt(i - 1) == '-') {
// x is opposite to the top of stack
int x = (s.peek() == 1) ? 0 : 1;
s.push(x);
}
// push value equal to top of the stack
else if (str.charAt(i - 1) == '+')
s.push(s.peek());
}
// If closing parentheses pop the stack once
else if (str.charAt(i) == ')')
s.pop();
else if(str.charAt(i) == '(' && i == 0)
i = 0;
// copy the character to the result
else
res[index++] = str.charAt(i);
i++;
}
return new String(res);
}
// Driver program
public static void main(String[] args)
{
String s1 = "(a-(b+c)+d)";
String s2 = "a-(b-c-(d+e))-f";
System.out.println(simplify(s1));
System.out.println(simplify(s2));
}
}
Python3
# Python3 program to simplify algebraic String
# Function to simplify the String
def simplify(Str):
Len = len(Str)
# resultant String of max Length
# equal to Length of input String
res = [None] * Len
index = 0
i = 0
# create empty stack
s = []
s.append(0)
while (i < Len):
if (Str[i] == '(' and i == 0):
i += 1
continue
if (Str[i] == '+'):
# If top is 1, flip the operator
if (s[-1] == 1):
res[index] = '-'
index += 1
# If top is 0, append the
# same operator
if (s[-1] == 0):
res[index] = '+'
index += 1
else if (Str[i] == '-'):
if (s[-1] == 1):
res[index] = '+'
index += 1
else if (s[-1] == 0):
res[index] = '-'
index += 1
else if (Str[i] == '(' and i > 0):
if (Str[i - 1] == '-'):
# x is opposite to the top of stack
x = 0 if (s[-1] == 1) else 1
s.append(x)
# append value equal to top of the stack
else if (Str[i - 1] == '+'):
s.append(s[-1])
# If closing parentheses pop
# the stack once
else if (Str[i] == ')'):
s.pop()
# copy the character to the result
else:
res[index] = Str[i]
index += 1
i += 1
return res
# Driver Code
if __name__ == '__main__':
s1 = "(a-(b+c)+d)"
s2 = "a-(b-c-(d+e))-f"
r1 = simplify(s1)
for i in r1:
if i != None:
print(i, end = " ")
else:
break
print()
r2 = simplify(s2)
for i in r2:
if i != None:
print(i, end = " ")
else:
break
# This code is contributed by PranchalK
C#
// C# program to simplify algebraic string
using System;
using System.Collections.Generic;
class GfG
{
// Function to simplify the string
static String simplify(String str)
{
int len = str.Length;
// resultant string of max length equal
// to length of input string
char []res = new char[len];
int index = 0, i = 0;
// create empty stack
Stack s = new Stack ();
s.Push(0);
while (i < len)
{
// Don't do any operation
if(str[i] == '(' && i == 0)
{
i++;
continue;
}
if (str[i] == '+')
{
// If top is 1, flip the operator
if (s.Peek() == 1)
res[index++] = '-';
// If top is 0, append the same operator
if (s.Peek() == 0)
res[index++] = '+';
}
else if (str[i] == '-')
{
if (s.Peek() == 1)
res[index++] = '+';
else if (s.Peek() == 0)
res[index++] = '-';
}
else if (str[i] == '(' && i > 0)
{
if (str[i - 1] == '-')
{
// x is opposite to the top of stack
int x = (s.Peek() == 1) ? 0 : 1;
s.Push(x);
}
// push value equal to top of the stack
else if (str[i - 1] == '+')
s.Push(s.Peek());
}
// If closing parentheses pop the stack once
else if (str[i]== ')')
s.Pop();
// copy the character to the result
else
res[index++] = str[i];
i++;
}
return new String(res);
}
// Driver code
public static void Main(String[] args)
{
String s1 = "(a-(b+c)+d)";
String s2 = "a-(b-c-(d+e))-f";
Console.WriteLine(simplify(s1));
Console.WriteLine(simplify(s2));
}
}
// This code has been contributed by 29AjayKumar
Javascript
输出
a-b-c+d
a-b+c+d+e-f