forked from TheAlgorithms/C
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Christian Bender
committed
Feb 14, 2019
1 parent
a080a2a
commit 02cf095
Showing
2 changed files
with
117 additions
and
89 deletions.
There are no files selected for viewing
89 changes: 0 additions & 89 deletions
89
data_structures/stack/balanced parenthesis using stack in C
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <string.h> | ||
#include <assert.h> | ||
|
||
#define SIZE 100 | ||
|
||
struct node | ||
{ | ||
char data; | ||
struct node *link; | ||
}; | ||
|
||
int c = 0; // c used as counter to check if stack is empty or not | ||
struct node *head; //declaring head pointer globally assigned to NULL | ||
|
||
void push(char x) //function for pushing | ||
{ | ||
struct node *p = head, *temp; | ||
temp = (struct node *)malloc(sizeof(struct node)); | ||
temp->data = x; | ||
if (head == NULL) //will be execute only one time i.e, 1st time push is called | ||
{ | ||
head = temp; | ||
p = head; | ||
p->link = NULL; | ||
c++; | ||
} | ||
else | ||
{ | ||
temp->link = p; | ||
p = temp; | ||
head = p; | ||
c++; | ||
} | ||
} | ||
|
||
char pop(void) //function for pop | ||
{ | ||
char x; | ||
struct node *p = head; | ||
x = p->data; | ||
head = p->link; | ||
free(p); | ||
c--; | ||
return x; | ||
} | ||
|
||
int isBalanced(char *s) | ||
{ | ||
int i = 0; | ||
char x; | ||
while (s[i] != '\0') //loop for covering entire string of brackets | ||
{ | ||
// printf("\t s[i]=%c\n", s[i]); //DEBUG | ||
if (s[i] == '{' || s[i] == '(' || s[i] == '[') //if opening bracket then push | ||
push(s[i]); | ||
else | ||
{ | ||
if (c <= 0) //i.e, stack is empty as only opening brackets are added to stack | ||
return 0; | ||
|
||
x = pop(); | ||
if (x == '{' && s[i] != '}') | ||
return 0; | ||
if (x == '[' && s[i] != ']') | ||
return 0; | ||
if (x == '(' && s[i] != ')') | ||
return 0; | ||
} | ||
i++; | ||
} | ||
|
||
//at end if stack is empy which means whole process has been performed correctly so return 1 | ||
return (c == 0) ? 1 : 0; | ||
} | ||
|
||
void destroyStack(void) | ||
{ | ||
struct node *p = head; | ||
if (c > 0) | ||
{ | ||
while (p->link) | ||
{ | ||
struct node *tmp = p; | ||
p = p->link; | ||
free(tmp); | ||
} | ||
|
||
c = 0; | ||
} | ||
} | ||
|
||
int main(void) | ||
{ | ||
int t; | ||
printf("\t\tBalanced parenthesis\n\n"); | ||
printf("\nPlease enter the number of processing rounds? "); | ||
scanf("%d", &t); | ||
for (int a0 = 0; a0 < t; a0++) | ||
{ | ||
char s[SIZE]; | ||
int result; | ||
printf("\nPlease enter the expression? "); | ||
scanf("%s", s); | ||
result = isBalanced(s); | ||
|
||
if (result == 1) | ||
printf("\nYES\n"); | ||
else | ||
printf("\nNO\n"); | ||
|
||
/* tidy up stack for new round */ | ||
destroyStack(); | ||
} | ||
return 0; | ||
} |