Reputation: 87
It's a program for checking balance of parenthesis in C using a stack but it is not working as expected.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
char data;
struct node *next;
};
struct node *top = NULL; //top stores address of top element of stack
void push(char data) { //inserting element
struct node *temp = (node *)malloc(sizeof(struct node));
temp->data = data;
temp->next = NULL;
if (top == NULL) {
top = temp;
return;
}
temp->next = top;
top = temp;
}
void pop() { //removing element
struct node *temp = top;
if (top == NULL) {
printf("No element to delete");
return;
}
top = top->next;
free(temp);
}
char Top() { //fn tht return top element of stack
return top->data;
}
int isEmpty() {
if (top != NULL) {
return 1;
} else
return 0;
}
int ArePair(char opening, char closing) {
if (opening == '(' && closing == ')')
return 1;
else if (opening == '{' && closing == '}')
return 1;
else if (opening == '[' && closing == ']')
return 1;
return 0;
}
int Arebalanced(char exp[]) {
int i;
for (i = 0; i < strlen(exp); i++) {
if (exp[i] == '(' || exp[i] == '{' || exp[i] == '[')
push(exp[i]);
else if (exp[i] == ')' || exp[i] == '}' || exp[i] == ']') {
if (isEmpty() || !ArePair(Top(), exp[i]))
return 0;
else
pop();
}
}
return isEmpty() ? 1 : 0;
}
int main() {
int i;
char a[50];
printf("Enter expession: ");
gets(a);
if (Arebalanced(a)) {
printf("balanced \n");
} else
printf("not balanced\n");
}
Upvotes: 2
Views: 1218
Reputation: 144695
Function isEmpty()
seems incorrect: it returns 1
if the stack is not empty?
Try this version:
int isEmpty() { return top == NULL; }
And do not use gets()
:
int main(void) {
char a[50];
printf("Enter expression: ");
if (fgets(a, sizeof a, stdin)) {
if (Arebalanced(a)) {
printf("balanced \n");
} else {
printf("not balanced\n");
}
}
return 0;
}
Upvotes: 1