An algorithm to check if an expressions (parentheses) given in a string are balanced or not.
Example
Input:
'[{}]'
'[{}{}{}}]'
Output:
true
false
We will use Stack to solve the balanced parentheses problem.
Implementation
- We have to create a Stack of characters.
- We are then going to traverse through the given string and check if the characters matches to any one of these โ{โ, โ(โ, โ[โ then push it into the Stack.
- If the characters matches to โ}โ, โ)โ, โ]โ then pop an item from the Stack and check if it matches to its corresponding parentheses.
- If it matches then continue and check for others, otherwise it is not balanced.
- In the end after traversing the string if there are still items in stack then also it is not balanced.
// stack
function Stack(){
var items = [];
var top = 0;
//other methods go here
//Push an item in the Stack
this.push = function(element){
items[top++] = element
}
//top++, first performs the operation then increment's the value
//Pop an item from the Stack
this.pop = function(){
return items[--top];
}
//--top, first decrements the value then performs the operation
//Peek top item from the Stack
this.peek = function(){
return items[top - 1];
}
//Is Stack empty
this.isEmpty = function(){
return top === 0;
}
//Clear the Stack
this.clear = function(){
top = 0;
}
//Size of the Stack
this.size = function(){
return top;
}
}
//Function to check balanced parantheses
let checkBalancedParentheses = (str) => {
//Create a stack
let stack = new Stack();
for(let i = 0; i < str.length; i++){
if(str[i] == '{' || str[i] == '(' || str[i] == '['){
stack.push(str[i]);
}
if(str[i] == '}' || str[i] == ')' || str[i] == ']'){
//return false if stack is empty
if(stack.isEmpty()){
return false;
}
//Pop an item from the stack and check if it matches the corresponding parentheses
let temp = stack.pop();
if(temp == '{' && str[i] != '}'){
return false;
}else if(temp == '[' && str[i] != ']'){
return false;
}else if(temp == '(' && str[i] != ')'){
return false;
}
}
}
//If stack is empty after traversing the string then return true
if(stack.isEmpty()){
return true;
}else{
return false;
}
}
Input:
console.log(checkBalancedParentheses('[{}]'));
console.log(checkBalancedParentheses('[{}{}{}{]'));
console.log(checkBalancedParentheses('({[]}){}[][({})]'));
Output:
//How it works
/*
stack = new Stack();
loop
each character of string
first character = '['
if(character == '{' || character == '[' || character == '('){
stack.push(character) = ['[']
}
second character = '{'
if(character == '{' || character == '[' || character == '('){
stack.push(character) = ['{','[']
}
third character = '}'
if(character == '}' || character == ']' || character == ')'){
//Condition is false
if(stack.isEmpty()){
return false;
}
var temp = stack.pop(); temp = '{'
//Condition is false
if(temp == '{' && str[i] != '}'){
return false
}
}
do the same for all the characters in the string
in the end, check if the stack is empty or not
return true if empty else return false;
*/
true
false
true
Time Complexity: O(n) where n is the no of characters in the string.
Space Complexity: O(n) where n is the no of characters in the string.
Time and Space complexity
- We are traversing through each character of string, Time complexity O(n).
- We are storing the opposite parentheses characters in the stack, in the worst case there can be all the opposite characters in the string, Space complexity O(n).