练习1-24.编写一个程序来判断C程序的基本情况 语法错误,如不匹配的圆括号、方括号和大括号.别 忘记引号,包括单引号和双引号,转义序列 comments .(如果你完全泛泛地做这个程序,这个程序会很难.)

这是我为该程序编写的代码(它还没有完成,我稍后将对其进行更多的工作):

#include <stdio.h>

#define YES 1
#define NO 0

int a = 0;

void push(int stack[], int c);
void pull(int stack[]);
int check(int stack[], int c);

int main()
{
    int stack[1000], c, keep = 1;

    extern int a;

    while ((c = getchar()) != EOF && keep == YES)
    {
        if (c == '[' || c == '(' || c == '{')
            push(stack, c);

        else if (c == ']' || c == ')' || c == '}')
            keep = check(stack, c);

    }

    return 0;
}

void push(int stack[], int c)
{
    int i;

    for (i = a; i; --i)
        stack[i+1] = stack[i];

    ++a;

    stack[0] = c;
}

void pull(int stack[])
{
    int i;

    --a;

    for (i = 0; i < a; ++i)
        stack[i] = stack[i+1];

    stack[a] = '\0';
}

int check(int stack[], int c)
{
    if ((c == ']' && stack[0] == '[') || (c == ')' && stack[0] == '(') || (c == '}' && stack[0] == '{'))
    {
        pull(stack);
        return YES;
    }

    else
    {
        printf("Mismatched character: '%c'\n", c);
        return NO;
    }
}

当我给它一个类似{}( ) () {} []的输出时,它可以工作,但当我给它类似(())的输出时,它会给我这个输出:

enter image description here

推荐答案

你的push美元套路被打破了.当i为零时,循环for (i = a; i; --i)从不执行主体,因此它从不执行stack[1] = stack[0].你需要测试到i >= 0分.(但是,有一种更好的方法可以实现堆栈,而不必在每次推入或弹出 timeshift 动所有元素.此外,我们将从堆栈顶部移除项目称为"弹出",而不是"拉".)

C++相关问答推荐

如何将匿名VLA分配给指针?

设计处理各种数据类型的方法和数据 struct

如何解决C中的严格别名?

为什么在C中二维字符数组会有这样的行为?

特定闪存扇区的内存别名

在一个小型玩具项目中实现终端历史记录功能

进程已完成,退出代码为138 Clion

如何将另一个数组添加到集合中,特别是字符串?

为什么Fread()函数会读取内容,然后光标会跳到随机位置?

我在反转双向链表时遇到问题

当内存来自Malloc时,将char*转换为另一个指针类型是否违反了严格的别名规则?

C11/C17标准允许编译器清除复合文字内存吗?

用C++构建和使用DLL的困惑

C++中PUTS函数的返回值

发送和接收的消息中的Unix域套接字不匹配

用C++初始化局部数组变量

即使客户端不发送数据,也会发生UNIX套接字读取

C 语言中 CORDIC 对数的问题

函数的typedef是标准 C 语法吗?它与函数指针的typedef有何不同?

如何使用 raylib 显示数组中的图像