# Opening and closing gates problem | Algorithm to find whether people are safe or not

A water reservation system constructed in a city has several opening and closing gates. If any opening gates are not closed with a corresponding closing gate then the water will leak out of the system and there will be a threat to the life of people living in the city. Also, the closing gate cannot exist without the opening gate, so the system head checks the design of the system and he has to ensure that the people are safe in the city. Write an algorithm to find whether people are safe or not.

Input:
The input to the function/method consists of one argument- str, a string representing the sequence of gates of the water reservation system.

Output:
Return an integer representing the number of gates which have closing gates corresponding to the opening gates else return an integer-1.

Constraints:
The opening gates are representing by “(“ and closing gates are representing “)”

Example 1
Input: Str =()()
Output: 3

Logic:
This problem is like the balanced parenthesis problem. Once a pair of parenthesis is found (the pair should have an opening parenthesis and closing parenthesis), a counter is incremented.

## Solution to opening and closing gates problem

#include <stdio.h>
int top = -1,c=0;
char stack[100];

// function prototypes
void push(char);
void pop();
void find_top();
int main()
{
int i;
char a[100];
printf(“enter expression\n”);
scanf(“%s”, &a);
for (i = 0; a[i] != ‘\0’;i++)
{
if (a[i] == ‘(‘)
{
push(a[i]);
}
else if (a[i] == ‘)’)
{
pop();
}
}
find_top();
return 0;
}

// to push elements in stack
void push(char a)
{
stack[top] = a;
top++;
}

// to pop elements from stack
void pop()
{
if (top == -1)
{
printf(“-1”);
exit(0);
}
else
{
top–;
c++;
}
}

// to find top element of stack
void find_top()
{
if (top == -1)
printf(“%d”,c);
else
printf(“-1”);
}

#include<iostream>
#include<string.h>             //to use strlen(), we need to include this header
using namespace std;
char st[20];
int top=-1;

void push(char a)
{
st[++top]=a;
}
char pop()
{
return st[top–];
}
int main()
{
char a[20],t;
int i,f=1;
int count=0;
cout<<“Enter the String: “;
cin>>a;
for(i=0;i<strlen(a);i++)
{
if(a[i]=='(‘)
push(a[i]);
if(a[i]==’)’)
{
if(top==-1)
f=0;
else
{
t=pop();
if(t=='(‘)
count++;
}
}
}

if(top>=0)
f=0;
if(f==0)
cout<<“-1”;
else
cout<<“Count: “<<count;
return 0;
}

import java.util.Scanner;
import java.util.*;

public class Main
{
public static int isParenthesisMatch(String str)
{
Stack<Character> stack = new Stack<Character>();
int count = 0;
char c;
for(int i=0; i < str.length(); i++)
{
c = str.charAt(i);
if(c == ‘(‘)
stack.push(c);

if(c == ‘)’)
{
if(stack.empty())
{
count = -1;
return count;
}
else if(stack.peek() == ‘(‘)
{
count++;
stack.pop();
}
else
return count;
}
}
return count;
}

public static void main(String args[])
{
Scanner sc = new Scanner(System.in);
System.out.println(“Enter the string: “);
String str = sc.nextLine();
System.out.println(isParenthesisMatch(str));
}
}

s = input(“Enter the string: “)
flag = 1
count = 0
stack = []
for x in s:
if x == ‘(‘:
stack.append(x)
if x == ‘)’:
if stack == []:
flag = 0
break
t = stack.pop()
if t != ‘(‘:
flag = 0
break
else:
count = count+1
if flag == 1:
print(“Count: %d” %(count))
else:
print(“-1”)

Output: