gpt4 book ai didi

c - 安排代码以分隔 C 中的函数

转载 作者:太空狗 更新时间:2023-10-29 14:49:18 24 4
gpt4 key购买 nike

我在大学做练习,这里是:“输入等式,检查是否有括号。如果它是开放的 - 压入堆栈。如果它是关闭的 - 检查堆栈的头元素是左括号/圆括号。如果堆栈为空,则等式是正确的”。我编写了代码以在 main() 函数中检查它。但需要在第一个函数中检查方程的元素是否为括号/括号,并与下一个括号/括号进行比较。

如果你能帮助我,非常感谢)。代码如下:

#include <stdio.h> <stdlib.h> <string.h>

#define STACK_SIZE 20
#define OVERFLOW -100
#define UNDERFLOW -101

///BEGIN DEFINING
typedef char C;
typedef struct Stack_tag {
C data[STACK_SIZE];
size_t size;
} Stack;
///END DEFINING

///BEGIN STACK FUNCTIONS
void Push(Stack* stack, const C value) {
if (stack->size >= STACK_SIZE) exit(OVERFLOW);

stack->data[stack->size] = value;
stack->size++;
}

C Pop(Stack* stack) {
if (stack->size == 0) exit(UNDERFLOW);

stack->size--;
return stack->data[stack->size];
}

C Peek(const Stack* stack) {
if (stack->size <= 0) exit(UNDERFLOW);
return stack->data[stack->size - 1];
}

void PrintStackValue(const C value) {
printf("%c", value);
}

void PrintStack(const Stack* stack, void(*PrintStackValue)(const C)) {
int i, len = stack->size - 1;
printf("\nStack %d", stack->size);
for (i = 0; i < len; i++) {
PrintStackValue(stack->data[i]);
printf(" | ");
}
if (stack->size != 0) {
PrintStackValue(stack->data[i]);
}
printf("\n");
}
///END STACK FUNCTIONS

///BEGIN OTHER FUNCTIONS
char isBr(char item) {
switch (item) {
case '(': return '(';
case ')': return ')';
case '[': return '[';
case ']': return ']';
case '{': return '{';
case '}': return '}';
default: return NULL;
}
}
void Check(char item, Stack stack) {
switch (item) {
case '(': Push(&stack, item);
case '[': Push(&stack, item);
case '{': Push(&stack, item);
case ')': if (Peek(&stack) == '(') Pop(&stack);
case ']': if (Peek(&stack) == ']') Pop(&stack);
case '}': if (Peek(&stack) == '}') Pop(&stack);
}
}
///END OTHER FUNCTIONS
int main()
{
Stack stack;
stack.size = 0;
///EQUATION
char* equation;
int i;
equation = (char*)malloc(100 * sizeof(char));
printf("Enter the Equation: \n");
gets(equation);
///CHECKING PROCESS
///TODO:
///1) SEPARATE FUNCTIONS
for (i = 0; i < strlen(equation); i++) {
/*
if (equation[i] == '(' || equation[i] == '{' || equation[i] == '[') {
Push(&stack, equation[i]);
}
if (equation[i] == ')') {
if (Peek(&stack) == '(') Pop(&stack);
}
if (equation[i] == '}') {
if (Peek(&stack) == '{') Pop(&stack);
}
if (equation[i] == ']') {
if (Peek(&stack) == '[') Pop(&stack);
}
*/
char p = isBr(equation[i]);
Check(p, stack);

}



///PRINT THE RESULT
puts(stack.size == 0 ? "FINE" : "NOOPE!!!");
//PrintStack(&stack, PrintStackValue);

return 0;
}

最佳答案

这里有两个问题:

  • 当您将堆栈结构传递给Check 时,函数会看到堆栈的副本。因此,您所做的更改在 main 中丢失了——它们只对副本进行了。传递一个指向该结构的指针,就像您为堆栈操作的函数所做的那样。 (由于变量 stack 将成为 Check 中的指针,因此您应该将 stack 而不是 &stack 传递给堆栈函数。)

  • C 中的 switch 语句中的情况不是孤立的。如果您不以 breakreturn 结束代码,执行将“失败”到下一个案例。

您的检查功能可能如下所示:

void Check(char item, Stack *stack) {
switch (item) {
case '(': Push(stack, item); break;
case '[': Push(stack, item); break;
case '{': Push(stack, item); break;
case ')': if (Peek(stack) == '(') Pop(stack); break;
case ']': if (Peek(stack) == ']') Pop(stack); break;
case '}': if (Peek(stack) == '}') Pop(stack); break;
}
}

然后你像这样从 main 调用它:

Check(p, &stack);

进一步观察:

  • 堆栈下溢不应导致程序立即退出。相反,它应该会导致出现一条消息,指出方程式有误。
  • 如评论中所述,不要使用不安全且已弃用的函数 gets。请改用 fgets
  • 确实没有必要使用 malloc 在堆上分配 100 个字符的缓冲区。只需使用一个自动数组:char equation[100];。如果您使用 malloc,则在从 main 返回之前还必须使用 free

关于c - 安排代码以分隔 C 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58417984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com