简体   繁体   English

这是一个使用堆栈检查C中括号平衡的程序,但未按预期工作

[英]It's a program for checking balance of parenthesis in C using a stack but it is not working as expected

It's a program for checking balance of parenthesis in C using a stack but it is not working as expected. 这是一个使用堆栈检查C中括号平衡的程序,但未按预期工作。

#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");
}

Function isEmpty() seems incorrect: it returns 1 if the stack is not empty? 函数isEmpty()似乎不正确:如果堆栈不为空,则返回1

Try this version: 试试这个版本:

int isEmpty() { return top == NULL; }

And do not use gets() : 并且不要使用 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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM